سؤال

لقد نظرت إلى Usort ، لكنني ما زلت مرتبكًا بعض الشيء ...

إليك ما يبدو عليه كائن $ myobject:

Array
(
    [0] => stdClass Object
        (
            [tid] => 13
            [vid] => 4
        )

    [1] => stdClass Object
        (
            [tid] => 10
            [vid] => 4
        )

    [2] => stdClass Object
        (
            [tid] => 34
            [vid] => 4
        )

    [3] => stdClass Object
        (
            [tid] => 9
            [vid] => 4
        )

أنا رأيت هذا:

function cmp( $a, $b )
{ 
  if(  $a->weight ==  $b->weight ){ return 0 ; } 
  return ($a->weight < $b->weight) ? -1 : 1;
} 
usort($myobject,'cmp');

أحاول الفرز وفقًا لـ TID ، لكنني أعتقد أنني لست متأكدًا حقًا إذا كان عليّ تغيير الوزن إلى شيء ما؟ أم أنها ستعمل كما هي؟ جربته ، لكن لا شيء يخرج ...

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

المحلول

CMP هو أ أتصل مرة أخرى الوظيفة التي يستخدمها Usort لمقارنة الكائنات المعقدة (مثلك) لمعرفة كيفية فرزها. تعديل CMP لاستخدامك (أو أعد تسميته إلى كل ما تريد)

function cmp( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');

http://www.php.net/usort

نصائح أخرى

لقد كنت أحاول كتابة وظيفة مقارنة لمدة ثلاث ساعات. من السهل جدًا في الواقع ، لكنني اعتقدت أنني كنت أفتقد شيئًا وكتبته مرارًا وتكرارًا من الخوارزمية المتغيرة من الصفر بعدة طرق لاختبارها باستخدام صفيف العينة.

أخيرًا ، أدركت أن المشكلة في وظيفة UASORT الداخلية. لا ينتهي مقارنة مع جميع العناصر. لا أتذكر اسم الخوارزمية المستخدمة في الوقت الحالي ، لكنني نفسي أستخدم نسخة محسّنة (OW Mine) في C ++. تستخدم الخوارزمية طريقة مقارنة بين شجرة ثنائية عن طريق تقسيم الصفيف إلى أكبر عدد ممكن من الأزواج كما هو مطلوب في مكالمة عودية إلى وظيفة الفرز مع فهارس جديدة (حدود أعلى) في كل مرة.

عندما تكون الشريحة المتبقية من عنصر واحد ، تكون الفهارس العلوية والسفلية متماثلة وتظن الوظيفة أنها قد انتهت (تم التعامل مع جميع العناصر) على الرغم من عدم تقييم العنصر الأخير. تفشل وظائف الفرز باستخدام هذه الخوارزمية عندما يكون للكتلة الأكثر كلفة رقمًا غريبًا. إنه يعمل بشكل جيد 2 ، 4 ، 8 .... عناصر ، ولكن لا يمكن العمل مع 3 ، 5 ، 7 وما إلى ذلك ... تعتمد الحالة الدقيقة للفشل على ترتيب فرز العناصر. قد لا تكون الأرقام ذات معنى دائمًا.

لقد حلت هذه المشكلة منذ سنوات. لا أستطيع حلها بنفسي بالنسبة لـ PHP الآن لأنني لا أملك برنامج التحويل البرمجي PHP وليس لدي رمز مصدر PHP أيضًا. ولكن إذا اتصل بي أي شخص من فريق تطوير PHP ، فيمكنني توفير نسخة العمل من هذه الخوارزمية في C ++. نفس الخوارزمية هي أسرع طريقة للوصول إلى العناصر المصنفة.

للحصول على خاصية كائن stdclass استخدم مشغل -> {'name_property'} ، على سبيل المثال $ a -> {'tid'}

function cmp( $a, $b )
{ 
  if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
  return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
  return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top