В основном у меня есть настройка вроде:
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 и разных методов, но я просто не могу показаться, что обманываю его. Клавиша [значение] будет находиться в диапазоне от 0 до 100, и мне нужны все массивы, отсортированные в порядке убывания (IE: 100 до 0).
Использовать 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');
100% украдены из первого ответа на этой странице. http://us.php.net/manual/en/function.array-multisort.php
Но это то, что я искал.
multisort a Array of Objects:
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 ) ) )
по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 ) ) )
Способ сделать это – отделить массив значений от массива объектов и, таким образом, создать два массива. Затем вы можете использовать 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(); } ?>
Это получит значение Object и вставляет его в другой массив, который вы можете использовать с мультисортировкой.
В конце концов, ваш код будет выглядеть так:
<?php foreach( $arraywithobjects as $obj ) { $objectvalues[] = $obj->getValue(); } $array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4); array_multisort($objectvalues, $array2); ?>
Первый массив в поле array_multisort должен быть массивом, который вы используете для сортировки второго массива.
Вы также можете добавить для этого другой метод сортировки. Вы можете прочитать их здесь: link text
function cmp($a, $b) { return $b->value - $a->value; } $ary[0] = usort($ary[0], "cmp");
Чтобы отсортировать массив на основе чего-либо другого, кроме простого значения или ключа, вам нужно использовать функцию usort
и предоставить собственное сравнение. Функции сравнения должны быть определены таким образом, что если $a
встречается до $b
, возвращается положительное значение и отрицательное значение, если $b
встречается до $a
(или нуля, если они равны). Поскольку вы сравниваете на основе значений чисел и хотите обратный сортировать, самый простой способ сделать это – вычесть «значение» $a
из значения $b
.
Я мог ошибаться, но я считаю, что сделал что-то подобное, используя asort () (или asort ()). Это было в функции поиска, где мне нужно было отсортировать двумерный массив, заполненный индексами и отметками времени.
Я не уверен, что это будет работать в вашем случае, и я сделал это давно. Может быть, вам это поможет, удачи.