سؤال

ما هي الطريقة الأنيقة لفرز الكائنات في PHP؟أحب أن أنجز شيئًا مشابهًا لهذا.

$sortedObjectArary = sort($unsortedObjectArray, $Object->weight);

حدد بشكل أساسي المصفوفة التي أريد الفرز فيها بالإضافة إلى الحقل الذي أريد الفرز عليه.لقد بحثت في فرز المصفوفات متعددة الأبعاد وقد يكون هناك شيء مفيد هناك، لكنني لا أرى أي شيء أنيق أو واضح.

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

المحلول

تقريبا حرفيا من الدليل:

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

usort($unsortedObjectArray, 'compare_weights');

إذا كنت تريد أن تكون الكائنات قادرة على فرز نفسها، راجع المثال 3 هنا: http://php.net/usort

نصائح أخرى

لـ php >= 5.3

function osort(&$array, $prop)
{
    usort($array, function($a, $b) use ($prop) {
        return $a->$prop > $b->$prop ? 1 : -1;
    }); 
}

لاحظ أن هذا يستخدم وظائف/إغلاقات مجهولة.قد تجد مراجعة مستندات php بشأن ذلك مفيدًا.

يمكنك أيضًا إنشاء سلوك الفرز في الفصل الذي تقوم بفرزه، إذا كنت تريد هذا المستوى من التحكم

class thingy
{
    public $prop1;
    public $prop2;

    static $sortKey;

    public function __construct( $prop1, $prop2 )
    {
        $this->prop1 = $prop1;
        $this->prop2 = $prop2;
    }

    public static function sorter( $a, $b )
    {
        return strcasecmp( $a->{self::$sortKey}, $b->{self::$sortKey} );
    }

    public static function sortByProp( &$collection, $prop )
    {
        self::$sortKey = $prop;
        usort( $collection, array( __CLASS__, 'sorter' ) );
    }

}

$thingies = array(
        new thingy( 'red', 'blue' )
    ,   new thingy( 'apple', 'orange' )
    ,   new thingy( 'black', 'white' )
    ,   new thingy( 'democrat', 'republican' )
);

print_r( $thingies );

thingy::sortByProp( $thingies, 'prop1' );

print_r( $thingies );

thingy::sortByProp( $thingies, 'prop2' );

print_r( $thingies );

بالنسبة لوظيفة المقارنة هذه، يمكنك فقط القيام بما يلي:

function cmp( $a, $b )
{ 
    return $b->weight - $a->weight;
} 

دالة المستخدم (http://uk.php.net/manual/en/function.usort.php) هو صديقك.شيء مثل...

function objectWeightSort($lhs, $rhs)
{
   if ($lhs->weight == $rhs->weight)
     return 0;

   if ($lhs->weight > $rhs->weight)
     return 1;

   return -1;
}

usort($unsortedObjectArray, "objectWeightSort");

لاحظ أنه سيتم فقدان أية مفاتيح صفيف.

يمكنك استخدام مستخدم () وظيفة وجعل وظيفة المقارنة الخاصة بك.

$sortedObjectArray = usort($unsortedObjectArray, 'sort_by_weight');

function sort_by_weight($a, $b) {
    if ($a->weight == $b->weight) {
        return 0;
    } else if ($a->weight < $b->weight) {
        return -1;
    } else {
        return 1;
    }
}

اعتمادًا على المشكلة التي تحاول حلها، قد تجد أيضًا واجهات SPL مفيدة.على سبيل المثال، تنفيذ واجهة ArrayAccess سيسمح لك بالوصول إلى الفصل الدراسي الخاص بك مثل المصفوفة.كما أن تنفيذ واجهة SeekableIterator سيسمح لك بالتكرار عبر كائنك تمامًا مثل المصفوفة.بهذه الطريقة يمكنك فرز الكائن الخاص بك تمامًا كما لو كان مصفوفة بسيطة، مع التحكم الكامل في القيم التي يُرجعها لمفتاح معين.

لمزيد من التفاصيل:

function PHPArrayObjectSorter($array,$sortBy,$direction='asc')
{
    $sortedArray=array();
    $tmpArray=array();
    foreach($this->$array as $obj)
    {
        $tmpArray[]=$obj->$sortBy;
    }
    if($direction=='asc'){
        asort($tmpArray);
    }else{
        arsort($tmpArray);
    }

    foreach($tmpArray as $k=>$tmp){
        $sortedArray[]=$array[$k];
    }

    return $sortedArray;

}

على سبيل المثال =>

$myAscSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'asc');

$myDescSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'desc');

يمكن أن يكون لديك نفس الرمز تقريبًا الذي نشرته مرتبة وظيفة من Nspl:

use function \nspl\a\sorted;
use function \nspl\op\propertyGetter;
use function \nspl\op\methodCaller;

// Sort by property value
$sortedByWeight = sorted($objects, propertyGetter('weight'));

// Or sort by result of method call
$sortedByWeight = sorted($objects, methodCaller('getWeight'));

إذا كنت ترغب في استكشاف النطاق الكامل (المرعب) لوظائف نمط لامدا في PHP، فراجع:http://docs.php.net/manual/en/function.create-function.php

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