سؤال

لدي صفيف في هذا التنسيق:

Array
(
    [0] => Array
        (
            [28th February, 2009] => 'bla'
        )

    [1] => Array
        (
            [19th March, 2009] => 'bla'
        )

    [2] => Array
        (
            [5th April, 2009] => 'bla'
        )

    [3] => Array
        (
            [19th April, 2009] => 'bla'
        )

    [4] => Array
        (
            [2nd May, 2009] => 'bla'
        )

) 

أريد فرزها في ترتيب تصاعدي للتواريخ (بناء على الشهر واليوم والسنة). ما هي أفضل طريقة للقيام بذلك؟

في الأصل يتم إحضار رسائل البريد الإلكتروني في تنسيق تاريخ MySQL، لذلك ممكن بالنسبة لي للحصول على صفيف في هذه الحالة:

Array
[
    ['2008-02-28']='some text',
    ['2008-03-06']='some text'
]

ربما عندما يكون في هذا التنسيق، يمكنني حلقة من خلالها، وإزالة كل '-' علامات (الواصلة) بحيث يتم تركها كأعداد تصميم، فرزها باستخدام array_sort() وحلقة من خلالهم مرة أخرى لفرزها؟ تفضل إذا كان هناك طريقة أخرى كما سأقوم بعمل 3 حلقات مع هذا لكل مستخدم.

شكرا.

تحرير: يمكنني أيضا القيام بذلك:

$array[$index]=array('human'=>'28 Feb, 2009',
                   'db'=>'20080228',
                   'description'=>'Some text here');

ولكن باستخدام هذا، سيكون هناك أي طريقة لفرز الصفيف بناء على عنصر "DB" وحده؟

تحرير 2: محدث Var_dump

هل كانت مفيدة؟

المحلول

استخدام ISO (yyyy-mm-dd) تنسيق بدلا من تنسيق "اللغة الإنجليزية"، ثم فقط استخدم ksort وظيفة للحصول عليها بالترتيب الصحيح.

ليست هناك حاجة لإزالة الواصلات، ksort سوف تفعل مقارنة أبجدي رقمي على مفاتيح السلسلة، و yyyy-mm-dd تنسيق يعمل بشكل جيد تماما كما الترتيب المعجمي هو نفس ترتيب التاريخ الفعلي.

تعديل أرى أنك قمت الآن بتصحيح سؤالك لإظهار أن لديك بالفعل مجموعة من الصفائف، وأن مفتاح الفرز في الصفائف الفرعية. في هذه الحالة، يجب عليك استخدام uksort كما أوصت في مكان آخر، لكنني أوصي أن تذهب مع تحريرك وفرزها بناء على تاريخ تنسيق DB، بدلا من تحليل تنسيق القابل للقراءة البشرية:

function cmp($a, $b)
{
    global $array;
    return strcmp($array[$a]['db'], $array[$b]['db']);
}

uksort($array, 'cmp');

نصائح أخرى

في الواقع، استخدم هذا:

usort($array, "cmp");

function cmp($a, $b){ 
    return strcmp($b['db'], $a['db']); 
}

:)

function cmp($a, $b) {    
    global $array;    
    return strcmp($array[$a]['db'], $array[$b]['db']); 
}    
uksort($array, 'cmp');

أعتقد أن هناك أفضل استخدام usort() وظيفة بدلا من uksort(), ، لأنه في بعض الأحيان لا يمكنك استخدام المتغيرات العالمية على الإطلاق وعلى أي حال باستخدام المتغيرات العالمية ليست ممارسة جيدة أيضا.

يمكنك أيضا استخدام وظيفة مجهولة الهوية.

// Sort in chronological order.
usort($array, function($a, $b) {
  return strcmp($a['db'], $b['db']);
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top