Почему / как работает этот array_multisort()?
Код:
<?php
$data = array(
'uid3' => array(
'name' => 'Unique ID 3',
'count' => 11
),
'uid1' => array(
'name' => 'Unique ID 1',
'count' => 11
),
'uid2' => array(
'name' => 'Unique ID 2',
'count' => 15
),
'uid4' => array(
'name' => 'Unique ID 4',
'count' => 13
)
);
$counts = array_map( function( $v ){
return $v[ 'count' ];
}, $data );
$names = array_map( function( $v ){
return $v[ 'name' ];
}, $data );
print_r( $counts );
print_r( $names );
array_multisort(
$counts, SORT_DESC, SORT_NUMERIC,
$names, SORT_ASC, SORT_STRING,
$data
);
print_r( $data );
Выход:
// $counts
Array
(
[uid3] => 11
[uid1] => 11
[uid2] => 15
[uid4] => 13
)
// $names
Array
(
[uid3] => Unique ID 3
[uid1] => Unique ID 1
[uid2] => Unique ID 2
[uid4] => Unique ID 4
)
// $data after sorting
Array
(
[uid2] => Array
(
[name] => Unique ID 2
[count] => 15
)
[uid4] => Array
(
[name] => Unique ID 4
[count] => 13
)
[uid1] => Array
(
[name] => Unique ID 1
[count] => 11
)
[uid3] => Array
(
[name] => Unique ID 3
[count] => 11
)
)
Вопрос:
Как array_multisort()
знать, чтобы применить результат сортировки $counts
к count
подраздел каждого элемента в многомерном массиве $data
?
Аналогично для $names
к name
под-ключ.
Бонус:
Если $names, SORT_ASC, SORT_STRING,
закомментировано из вызова функции, то uid3
все еще заканчивается после uid1
, Зачем?
Я читал следующие ресурсы, но не могу понять, как это применимо к моему примеру:
http://php.net/manual/en/function.array-multisort.php
1 ответ
Я не собирался публиковать это как ответ, но мне нужно было всего несколько дополнительных символов.
Я не могу сказать однозначно, как это происходит на техническом уровне, но я думаю, что конкретно обращаюсь к array_multisort()
знать, чтобы применить результат сортировки $counts
на ключ подсчета ", ответ" это не так ". Измените подключи, и вы получите тот же результат. Может быть, я не читаю ваш вопрос так, как вы хотели, но кажется, что вы ' Вы спрашиваете, как он знает, чтобы посмотреть на значения подключей $data
а затем сделать сортировку. Но это не так. Выглядит как $names
был отсортирован (который смотрит на то, как $counts
был отсортирован) и применяет тот же вид к первичным ключам $data
, Это означает, что он смотрит, какая исходная позиция была перемещена в какую новую позицию. Тот факт, что ваш первый массив состоит из значений одного подраздела, а второй - из другого подраздела, не имеет значения. Вручную соберите эти массивы в том же порядке, и вы получите те же результаты.
Что касается бонуса, я бы сказал, что он связан с "Если два члена сравниваются как равные, их относительный порядок в отсортированном массиве не определен". Так что это больше совпадение, чем все остальное.