用PHP按键值对排序一个对象数组的数组

6
基本上我有以下的设置:
Array ( 
[0] => Array ( [0] => stdClass Object ( [nid] => 1 [title] => title1 [uid] => 1 [parent] => 0 [weight] => -15 [name] => name1 [value] => 0 )
               [1] => stdClass Object ( [nid] => 2 [title] => title2 [uid] => 1 [parent] => 0 [weight] => -7 [name] => name2 [value] => 100 )
               [2] => stdClass Object ( [nid] => 3 [title] => title3 [uid] => 2 [parent] => 0 [weight] => -1 [name] => name3 [value] => 0 )
               [3] => stdClass Object ( [nid] => 4 [title] => title4 [uid] => 2 [parent] => 0 [weight] => 1 [name] => name4 [value] => 80 )
              )
  )

我需要的是一种方法来按对象中[value]键对父数组中的所有数组进行排序。我已经尝试了大约2天,使用usort和不同的方法,但我似乎无法理解它。[value]键将在0到100之间变化,我需要所有数组按降序排序(即:从100到0)。

5个回答

14
使用usort
function cmp($a, $b) {
  if ($a->value == $b->value) {
    return 0;
  } else {
    return $a->value < $b->value ? 1 : -1; // reverse order
  }
}

usort($arr, 'cmp');

1
在 else 子句中,只需将第一个 : 替换为 ? return $a->value < $b->value ? 1 : -1; // 反转顺序 - Jrgns

4

这篇答案的全部内容来自于本页面第一篇答案。 http://us.php.net/manual/en/function.array-multisort.php
但这正是我所需要的。

多重排序一个对象数组:

example object [$object with array of objects]: (class: test) 
---------------------------------- 

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [1] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [2] => test Object (
            [id] => 3
            [title] => DDDD
         )
      [3] => test Object (
            [id] => 4
            [title] => BBBB
         )
   )
)

---------------------------------- 

Simple PHP function: sort_arr_of_obj()

<?php 
// -------------------------------------- 

/* 
* -------- function arguments -------- 
*   $array ........ array of objects
*   $sortby ....... the object-key to sort by
*   $direction ... 'asc' = ascending
* --------
*/

function sort_arr_of_obj($array, $sortby, $direction='asc') {

    $sortedArr = array();
    $tmp_Array = array();

    foreach($array as $k => $v) {
        $tmp_Array[] = strtolower($v->$sortby);
    }

    if($direction=='asc'){
        asort($tmp_Array);
    }else{
        arsort($tmp_Array);
    }

    foreach($tmp_Array as $k=>$tmp){
        $sortedArr[] = $array[$k];
    }

    return $sortedArr;

}


// -------------------------------------- 
?>

example call: 
---------------------------------- 

<?php 

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');

?>

example result: $sorted (class: test) 
---------------------------------- 

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [1] => test Object (
            [id] => 4
            [title] => BBBB
         )
      [2] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [3] => test Object (
            [id] => 3
            [title] => DDDD
         )

   )
)

1
刚刚发现了这个解决方案。对我也起作用!谢谢 :) 不过,我确实需要稍微调整一下,因为它对我返回了空数组。$tmp_Array[$k] = strtolower($v->$sortby); - WastedSpace

3
一种方法是将值数组与对象数组分开,创建两个数组。然后可以使用array_multisort根据另一个数组对对象数组进行排序。以下是示例:
<?php
$array1 = $objectvalues
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
array_multisort($array1, $array2);
?>

您可以使用foreach循环数组一次,并创建一个带有相应[value]键的新数组:
<?php
foreach( $arraywithobjects as $obj )
{
    $objectvalues[] = $obj->getValue();
}
?>

这将获取对象的值并将其插入到另一个数组中,您可以将其与multisort一起使用。

最终,您的代码将如下所示:

<?php
foreach( $arraywithobjects as $obj )
{
    $objectvalues[] = $obj->getValue();
}
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
array_multisort($objectvalues, $array2);
?>

在array_multisort字段中的第一个数组应该是你用来对第二个数组进行排序的数组。

你还可以添加其他的排序方法。你可以在这里阅读它们:链接文本


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

$ary[0] = usort($ary[0], "cmp");

为了根据除简单值或键以外的任何内容对数组进行排序,您需要使用usort函数并提供自己的比较。比较函数必须被定义为如果$a$b之前,则返回正值,如果$b$a之前,则返回负值(如果它们相等,则返回零)。由于您是基于数字值进行比较,并且想要反向排序,因此最简单的方法是从$b的值中减去$a的“值”。

0

我可能错了,但我相信我曾经使用过asort()(或asort())来做类似的事情。这是在一个搜索函数中,我需要对一个填充有索引和时间戳的二维数组进行排序。

我不确定它是否适用于你的情况,而且我很久以前就做过了。也许它能帮助你入门,祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接