array (
[0] => array
(
[field1] => 'name'
[field2] => 'text'
[field3] => array
(
[0] => array
(
[text] => 'This arrays order is to be kept!'
[name] => 'Only sort the sub-sub-array below!'
[order] => ''
)
)
)
[1] => array
(
[field1] => 'name'
[field2] => 'text'
[field3] => array
(
[0] => array
(
[text] => '2014'
[name] => 'Dummy!'
[order] => '1'
)
[1] => array
(
[text] => '2013'
[name] => 'Try me!'
[order] => '2'
)
[2] => array
(
[text] => '1985'
[name] => 'Help!'
[order] => '5'
)
[3] => array
(
[text] => '2002'
[name] => 'Please!'
[order] => '4'
)
[4] => array
(
[text] => '2007'
[name] => 'Order!'
[order] => '3'
)
)
)
...
Я хочу сохранить массив 1-го и 2-го уровней, и он имеет значение как есть. Мне нужно отсортировать ключи во втором суб-массиве по значению в order
-field. Поэтому, когда он говорит годы, этот суб-массив должен быть отсортирован ASC или DESC. и все остальные ключи/значения/структура/карта должны храниться как есть.
Сортированный массив:
array (
[0] => array
(
[field1] => 'name'
[field2] => 'text'
[field3] => array
(
[0] => array
(
[text] => 'This arrays order is to be kept!'
[name] => 'Only sort the sub-sub-array below!'
[order] => ''
)
)
)
[1] => array
(
[field1] => 'name'
[field2] => 'text'
[field3] => array
(
[0] => array
(
[text] => '2014'
[name] => 'Dummy!'
[order] => '1'
)
[1] => array
(
[text] => '2013'
[name] => 'Try me!'
[order] => '2'
)
[2] => array
(
[text] => '2007'
[name] => 'Order!'
[order] => '3'
)
[3] => array
(
[text] => '2002'
[name] => 'Please!'
[order] => '4'
)
[4] => array
(
[text] => '1985'
[name] => 'Help!'
[order] => '5'
)
)
)
Я потратил часы и часы на различные пользовательские решения, в основном на основе usort()
но я также сделал это, зная, что ни один из этих вопросов и ответов не описывает ситуацию, которая у меня есть.
Я начинаю сомневаться, что это возможно. Кто-нибудь знает, если это так? И если да, можете ли вы пролить свет или дать подсказку/пример/демонстрацию?
Я извлекаю это из модели Laravel и используя toArray();
Есть ли лучший способ добиться этого в Ларавеле, я был бы рад узнать.
Если под-subarray, который вы хотите сортировать, всегда идентифицируется одним и тем же ключом, вы можете просто добавить содержимое этого ключа.
foreach ($test as &$value) {
// Using a (^) reference to each value will sort the existing
// array instead of creating a sorted copy.
usort($value['field3'], function($a, $b) {
// You can use an anonymous function like this for the usort comparison function.
if ($a['order'] < $b['order']) return -1;
if ($a['order'] == $b['order']) return 0;
// In case of 'order' ties, you may want to add a comparison of a different key
return 1; // $a['order'] must be > $b['order'] at this point
});
}
Обратите внимание, что функция сравнения, используемая в usort:
должно возвращать целое число, меньшее, равное или большее нуля, если первый аргумент считается менее чем, равным или большим, чем второй.
Возможно, лучше сделать это с помощью Laravel, потому что база данных, скорее всего, сможет выполнить эту сортировку быстрее, чем PHP, но нам нужно будет узнать гораздо больше о вашей модели, чтобы понять это, и это звучит, как в основном, полностью другой вопрос.
Если я правильно понял проблему, это могло бы быть решением (в этих примерах $arr
является переменной, содержащей массив):
function cmp($a, $b)
{
return ($a['order'] < $b['order']) ? -1 : 1;
}
foreach($arr as $key => $subarr){
foreach($subarr as $key2 => $subsubarr){
if(is_array($subsubarr)){
usort($subsubarr,"cmp");
$subarr[$key2] = $subsubarr;
}
}
$arr[$key] = $subarr;
}
или
function cmp($a, $b)
{
return ($a['order'] < $b['order']) ? -1 : 1;
}
foreach($arr as &$subarr){
foreach($subarr as &$subsubarr){
if(is_array($subsubarr)){
usort($subsubarr,"cmp");
}
}
}