проблема array_multisort с многомерным массивом в PHP

1

У меня есть следующий массив:

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);

Но он работает не так, как ожидалось. Какие-либо предложения?

  • 0
    попробуйте usort() и определите поведение сортировки
  • 0
    Возможно, попытайтесь перевернуть массивы array_multisort($sort['_sortorder'], SORT_ASC, $sort['_category_sortorder'], SORT_ASC, $resources);
Теги:
sorting

2 ответа

1
Лучший ответ

Попробуйте это,

$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>';
  • 0
    Спасибо, это работает для _category_sortorder , но как насчет _sortorder ? Позвонить usort снова?
  • 0
    Да, если вы хотите отсортировать его с помощью _sortorder, вам нужно сделать это снова. Но имейте в виду, что массив будет отсортирован по _category_sortorder во временном массиве, иначе он будет потерян
0

Я думаю, что есть простое решение, но этот блок кода выполняет задание: вы разбиваете массив в вспомогательных массивах, включая только те элементы с тем же значением _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>';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню