سؤال

لدي مثال صفيف:

$a = array(
    5   => 35,
    16  => 22,
    7   => 22,
    3   => 22,
    11  => 22,
    9   => 27,
);

وأريد فرزها بالقيم وتذكر مفاتيحها. النتيجة التي توقعتها كانت:

$a = array(
    16  => 22,
    7   => 22,
    3   => 22,
    11  => 22,
    9   => 27,
    5   => 35,
);

لذلك كانت فكرتي الأولى: asort ! حسنا لقد فعلت

asort($a);

لكن لا - لم يتحرك فقط 5 => 35 إلى نهاية المصفوفة. لقد غيرت صفيفتي إلى:

$a = array(
    11  => 22,
    3   => 22,
    7   => 22,
    16  => 22,
    9   => 27,
    5   => 35
);

هل ترى ؟ يتم فرز المفاتيح بنفس القيمة. لماذا ا ؟

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

المحلول

لا يمكنك توقع ترتيب فرز معين لقيم متساوية. من دليل PHP على صفائف الفرز:

إذا كان أي من وظائف هذه النوع يقيم عضوين على قدم المساواة ، فسيكون الترتيب غير محدد (الفرز غير مستقر).

نصائح أخرى

"لماذا" هو سؤال آخر.
لكنها في الواقع فعلت ما كنت تطلبه ، أليس كذلك؟
لم يتم تحديد الطلب الرئيسي.
إذا كنت تريد ترتيبًا معينًا من المفاتيح ، فيجب عليك تحديده في ظروف التمرين

http://en.wikipedia.org/wiki/sorting_algorithm#stability

باختصار ، التأكد من أن ترتيب المفاتيح التي تم فرزها بالفعل لا يزال هو نفسه سيكلف وقت حساب (وكل من صمم الوظيفة في PHP قرر أنه لا يستحق ذلك)

اعتمادًا على خوارزمية الفرز ، ربما بدأ الفرز بطريقة أخرى من مجرد اكتشاف أنه يجب أن يحرك هذا الزوج الوحيد فقط. لكنه انتهى الأمر بمصفوعة/قيم الحفاظ على مفاتيح/قيم تم فرزها بشكل صحيح. تبدو فقط تبديل لأن لديك 4 مفاتيح بقيم 22.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top