У меня есть следующий массив:
array(10) {
[0]=> array(109) {
["id"]=> string(4) "2632", ["_category_sortorder"] => 8, ["_sortorder" => 1]
},
[1]=> array(109) {
["id"]=> string(4) "2635", ["_category_sortorder"] => 5, ["_sortorder" => 2]
},
...
}
Я хочу сортировать его по двум критериям:
a) _category_sortorder
asc (с приоритетом)
b) _sortorder
asc
Я попробовал это:
foreach($resources as $k => $v) {
$sort[$k]['_category_sortorder'] = $resources[$k]['_category_sortorder'];
$sort[$k]['_sortorder'] = $resources[$k]['_sortorder'];
}
array_multisort($sort['_category_sortorder'], SORT_ASC, $sort['_sortorder'], SORT_ASC, $resources);
Но он работает не так, как ожидалось. Какие-либо предложения?
Попробуйте это,
$sort = array(
array("id"=>"263", "_category_sortorder"=> 8, "_sortorder" => 1),
array( "id"=> "145", "_category_sortorder" => 155, "_sortorder" => 2),
array( "id"=> "2145", "_category_sortorder" => 55, "_sortorder" => 12),
array( "id"=> "3145", "_category_sortorder" => 155, "_sortorder" => 10),
);
usort($sort, function(array $a, array $b) {
return $b['_category_sortorder'] - $a['_category_sortorder'];
});
echo '<pre>';
print_r($sort);
echo '</pre>';
_category_sortorder
, но как насчет _sortorder
? Позвонить usort
снова?
Я думаю, что есть простое решение, но этот блок кода выполняет задание: вы разбиваете массив в вспомогательных массивах, включая только те элементы с тем же значением _category_sortorder. Затем вы сортируете каждый дополнительный массив с помощью usort. В конце вы объедините их вместе.
<?php
$array = [
['id' => 1, '_category_sortorder' => 2, '_sortorder' => 1],
['id' => 2, '_category_sortorder' => 2, '_sortorder' => 3],
['id' => 3, '_category_sortorder' => 3, '_sortorder' => 19],
['id' => 4, '_category_sortorder' => 1, '_sortorder' => 2],
['id' => 5, '_category_sortorder' => 1, '_sortorder' => 1],
];
foreach ($array as $value) {
if (!isset($newElements[$value['_category_sortorder']]))
$newElements[$value['_category_sortorder']] = [];
$newElements[$value['_category_sortorder']][] = $value;
}
$array = [];
foreach ($newElements as $key => $value) {
usort($value, function($a, $b) {
return strcmp($a["_sortorder"], $b["_sortorder"]);
});
$array[$key] = $value;
}
ksort($array);
$new = [];
foreach ($array as $value) {
$new = array_merge($new, $value);
}
echo "<pre>".print_r($new, true).'</pre>';
usort()
и определите поведение сортировкиarray_multisort($sort['_sortorder'], SORT_ASC, $sort['_category_sortorder'], SORT_ASC, $resources);