Intereting Posts

PHP array_multisort не сортирует мой многомерный массив, как ожидалось

Я пытаюсь сортировать многомерный массив, используя функцию 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 с соответствующими возвращаемыми значениями.