Почему / как работает этот 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

как работает php array_multisort?

как отсортировать массив, как MySQL

1 ответ

Решение

Я не собирался публиковать это как ответ, но мне нужно было всего несколько дополнительных символов.

Я не могу сказать однозначно, как это происходит на техническом уровне, но я думаю, что конкретно обращаюсь к array_multisort() знать, чтобы применить результат сортировки $counts на ключ подсчета ", ответ" это не так ". Измените подключи, и вы получите тот же результат. Может быть, я не читаю ваш вопрос так, как вы хотели, но кажется, что вы ' Вы спрашиваете, как он знает, чтобы посмотреть на значения подключей $data а затем сделать сортировку. Но это не так. Выглядит как $names был отсортирован (который смотрит на то, как $counts был отсортирован) и применяет тот же вид к первичным ключам $data, Это означает, что он смотрит, какая исходная позиция была перемещена в какую новую позицию. Тот факт, что ваш первый массив состоит из значений одного подраздела, а второй - из другого подраздела, не имеет значения. Вручную соберите эти массивы в том же порядке, и вы получите те же результаты.

Что касается бонуса, я бы сказал, что он связан с "Если два члена сравниваются как равные, их относительный порядок в отсортированном массиве не определен". Так что это больше совпадение, чем все остальное.

Другие вопросы по тегам