Я пытаюсь сортировать многомерный массив, используя функцию array_multisort
Я ожидал, что многомерный массив закажет себя, используя значения в $ sort. $ sort относится к элементу тома моего многомерного массива.
Я хотел бы, чтобы элемент name находился в следующем порядке:
'name' => 8, 'name' => 6, 'name' => 7, 'name' => 9 ',' name '=> 10,' name '=> 10,
Возвращенный заказ не соответствует ожиданиям. Возможно, я неправильно понял, как работает array_multisort?
Array ( [test1] => Array ( [volume] => 67 [edition] => 2 [name] => 6 [num] => 2 ) [test2] => Array ( [volume] => 86 [edition] => 1 [name] => 7 [type] => 2 ) [test3] => Array ( [volume] => 85 [edition] => 6 [name] => 8 [type] => 2 ) [test4] => Array ( [volume] => 98 [edition] => 2 [name] => 9 [type] => 2 ) [test5] => Array ( [volume] => 86 [edition] => 6 [name] => 10 [type] => 2 ) [test6] => Array ( [volume] => 67 [edition] => 7 [name] => 11 [type] => 2 ) ) $sort = array(85, 67, 86, 98, 86, 67); array_multisort($sort, $data);
Вот исходный массив:
$data['test1'] = array('volume' => 67, 'edition' => 2, 'name' => 6, 'num' => 2,); $data['test2'] = array('volume' => 86, 'edition' => 1, 'name' => 7, 'type' => 2,); $data['test3'] = array('volume' => 85, 'edition' => 6, 'name' => 8, 'type' => 2,); $data['test4'] = array('volume' => 98, 'edition' => 2, 'name' => 9, 'type' => 2,); $data['test5'] = array('volume' => 86, 'edition' => 6, 'name' => 10, 'type' => 2,); $data['test6'] = array('volume' => 67, 'edition' => 7, 'name' => 11, 'type' => 2,);
С массивом Multisort вы можете сортировать в зависимости от столбца. Это пример, где вы можете легко отсортировать по «всем» доступным столбцам:
<? $data['test1'] = array('volume' => 67, 'edition' => 2, 'name' => 6, 'type' => 2); $data['test2'] = array('volume' => 86, 'edition' => 1, 'name' => 7, 'type' => 2); $data['test3'] = array('volume' => 85, 'edition' => 6, 'name' => 8, 'type' => 2); $data['test4'] = array('volume' => 98, 'edition' => 2, 'name' => 9, 'type' => 2); $data['test5'] = array('volume' => 86, 'edition' => 6, 'name' => 10, 'type' => 2); $data['test6'] = array('volume' => 67, 'edition' => 7, 'name' => 11, 'type' => 2); //Create index rows foreach ($data as $row) { foreach ($row as $key => $value){ ${$key}[] = $value; //Creates $volume, $edition, $name and $type arrays. } } //ex: sort by edition asc, then by name DESC: array_multisort($edition, SORT_ASC, $name, SORT_DESC, $data); echo "<pre>"; print_r($data); echo "</pre>"; ?>
(сначала по версии ASC, затем по названию DESC): (сортировка по имени ASC, обменять test4 и test1 ofc.)
Array ( [test2] => Array ( [volume] => 86 [edition] => 1 [name] => 7 [type] => 2 ) [test4] => Array ( [volume] => 98 [edition] => 2 [name] => 9 [type] => 2 ) [test1] => Array ( [volume] => 67 [edition] => 2 [name] => 6 [type] => 2 ) [test5] => Array ( [volume] => 86 [edition] => 6 [name] => 10 [type] => 2 ) [test3] => Array ( [volume] => 85 [edition] => 6 [name] => 8 [type] => 2 ) [test6] => Array ( [volume] => 67 [edition] => 7 [name] => 11 [type] => 2 ) )
Вы можете добавить столько столбцов, если хотите. Надеюсь, это поможет.
Изменить: Что касается вашего вопроса: Нет, массив MultiSort НЕ предназначен для сортировки массивов на основе предопределенного порядка. Что делает array_multisort: Он сортирует массив по заданному условию (asc или desc) и перемещает записи в других массивах относительно вверх или вниз, не нарушая сортировку любого другого массива .
базовый пример:
$letters = array("b","a","c"); $numbers = array(5,4,2);
вызов array_multisort($letters,$numbers)
приведет к a,b,c
и (a переместился вверх, b вниз) 4,5,2
если бы это был пример:
$letters = array("b","a","a"); $numbers = array(5,4,2);
сначала будет применяться a,a,b
та же сортировка: ( a,a,b
-> 4,2,5
), но затем array_multisort замечает, что он может поменять местами как s, так и сортировать 2 и 4. Final REsult: a,a,b
– > 2,4,5
Вернуться к вашему вопросу:
Для сортировки по предопределенному заказу вы можете сделать следующее:
1.) Определите свой порядок, то есть $order = array("a","z","b");
2.) Вызовите uasort
с пользовательской функцией.
3.) Внутри этой функции сортировки используйте привязку массива и доступ для доступа для получения фактической позиции:
$items = array("a","b","z","a","z","z"); uasort($items, "sortByPredefinedOrder"); function sortByPredefinedOrder($leftItem, $rightItem){ $order = array("a","z","b","x"); //defined somewhere $flipped = array_flip($order); //so we can access "position by value" $leftPos = $flipped[$leftItem]; $rightPos = $flipped[$rightItem]; return $leftPos >= $rightPos; } print_r($items); //Array ( [0] => a [3] => a [2] => z [4] => z [5] => z [1] => b )
для вашего многомерного ввода вы можете использовать
$leftPos = $flipped[$leftItem["volume"]]; $rightPos = $flipped[$rightItem["volume"]];
Но из. это потребовало бы, чтобы вы указали ВСЕ значения внутри предопределенного массива Array и обрабатывали IndexOutOfBoundExceptions с соответствующими возвращаемыми значениями.