Сортировка массива массивов объектов в PHP по значению ключа - PullRequest
5 голосов
/ 06 января 2009

В основном у меня есть настройки, подобные следующим:

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] в Object. Я уже около 2 дней пытаюсь использовать usort и другие методы, но я просто не могу разобраться с этим. Клавиша [значение] будет в диапазоне от 0 до 100, и мне нужно, чтобы все массивы сортировались в порядке убывания (т.е.: от 100 до 0).

Ответы [ 5 ]

13 голосов
/ 06 января 2009

Использование 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');
4 голосов
/ 10 декабря 2012

100% украдено с 1-го ответа на этой странице. 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
         )

   )
)
3 голосов
/ 18 июня 2009

Способ сделать это - отделить массив значений от массива объектов и, таким образом, создать два массива. Затем вы можете использовать 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();
}
?>

Это позволит получить значение объекта и вставить его в другой массив, который вы можете использовать с мультисортированием.

В конце ваш код будет выглядеть так:

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

Первый массив в поле array_multisort должен быть массивом, который вы используете для сортировки второго массива.

Для этого вы также можете добавить другой метод сортировки. Вы можете прочитать их здесь: текст ссылки

1 голос
/ 06 января 2009
function cmp($a, $b) {
    return $b->value - $a->value;
}

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

Чтобы отсортировать массив на основе чего-либо, кроме простого значения или ключа, вам нужно использовать функцию usort и предоставить собственное сравнение. Функции сравнения должны быть определены так, чтобы, если $a предшествовало $b, возвращалось положительное значение и отрицательное, если $b предшествует $a (или ноль, если они равны). Поскольку вы сравниваете на основе числовых значений и хотите выполнить обратную сортировку, самый простой способ сделать это - вычесть 'значение' из $a из значения $b.

0 голосов
/ 06 января 2009

Я могу ошибаться, но я думаю, что сделал что-то подобное, используя asort () (или asort ()). Это было в функции поиска, где мне нужно было отсортировать двумерный массив, заполненный индексами и временными метками.

Я не уверен, сработает ли это в вашем случае, и я сделал это давно. Может быть, это поможет вам начать, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...