通过变量obj属性排序对象数组

时间:2014-06-30 19:55:35

标签: php

我是sorting an array of objects by object property使用此过程:

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

usort($array_of_obj, "cmp"); //sorts array by object name

在我的例子中,object属性存储为变量$prop,以便我可以选择要排序的属性(名称,日期等)。所以,我想要这样的事情:

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

$prop = 'someproperty';
usort($array_of_obj, "cmp");  //sorts array by chosen object property, $prop

我的问题是,当我调用" cmp"时,我无法将值传递给$ prop参数。功能。如果这是一个死胡同的努力,或者如果有办法解决这个问题,我不确定我是否应该这样做。我该怎么办?

3 个答案:

答案 0 :(得分:3)

您可以将调用包装在匿名函数

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

$prop = 'someproperty';
usort($array_of_obj, function($a,$b) use ($prop) { 
    return cmp($a,$b,$prop); 
});

编辑:Explanation of the keyword 'use'

答案 1 :(得分:1)

您可以向类$a&添加静态属性。 $b属于共享父类。您可以将其称为“sort_property”,然后使用它:

   //Set the sort property 
   Class_of_a_and_b::$sort_property = 'name';

   //call sort
   usort($array_of_obj, "cmp");

   //....stuff ...

   function cmp($a, $b)
   {
         //in real code, maybe test if the sort property is valid...
         $sort_prop = Class_of_a_and_b::$sort_property;
         return strcmp($a->$sort_prop , $b->$sort_prop );
   }

当然,只有当它们是同一类的对象时,这才有效。

答案 2 :(得分:0)

只是一个想法

// ===============================================
// Start => Sort Object / Array by Key ===========
// ===============================================
function usort_array($array, $key, $order = 'asc') {
    if(strtolower($order) == 'asc')
        usort($array, function($a, $b) use ($key) { return strcmp($a[$key], $b[$key]); });
    else
        usort($array, function($a, $b) use ($key) { return strcmp($b[$key], $a[$key]); });
    return $array;
}

function usort_object($object, $key, $order = 'asc') {
    if(strtolower($order) == 'asc')
        usort($object, function($a, $b) use ($key) { return strcmp($a->$key, $b->$key); });
    else
        usort($object, function($a, $b) use ($key) { return strcmp($b->$key, $a->$key); });
    return $object;
}
// ===============================================
// End => Sort Object / Array by Key =============
// ===============================================