Пользовательская сортировка многомерного массива по ключам подмассива с использованием другого массива - PullRequest
0 голосов
/ 16 января 2019

У меня есть 2 массива. Array1 выглядит примерно так (это всего лишь небольшой пример, в действительности он имеет более 408 строк):

Array
(
    [0] => Array ( [536870925] => 34213897 )
    [1] => Array ( [536870923] => 34213905 )
    [2] => Array ( [536870923] => 34213913 )
    [3] => Array ( [536870928] => 34213921 )
    [4] => Array ( [536870926] => 34213929 )
    [5] => Array ( [536870919] => 34213937 )
    [6] => Array ( [536870918] => 34218041 )
    [7] => Array ( [536870925] => 34218049 )
    [8] => Array ( [536870929] => 34218057 )
    [9] => Array ( [536870920] => 34218065 )
    [10] => Array ( [536870920] => 34218073 )
)

И Array2 выглядит примерно так и имеет только 16 строк:

Array
(
    [0] => 536870922
    [1] => 536870923
    [2] => 536870924
    [3] => 536870925
    [4] => 536870926
    [5] => 536870927
    [6] => 536870928
    [7] => 536870929
    [8] => 536870914
    [9] => 536870915
    [10] => 536870916
    [11] => 536870917
    [12] => 536870918
    [13] => 536870919
    [14] => 536870920
    [15] => 536870921
)

Все идентификаторы в массиве 2 существуют в массиве1.

И array1, и array2 собраны из двух разных индексов. Мне нужно изменить порядок идентификаторов и эквивалентного значения из массива1, чтобы они соответствовали порядку идентификаторов, представленных в массиве 2.

Я пытался использовать foreach с array1, но используя array2 в качестве контроллера, что-то вроде этого, очевидно, это не сработало ..

$i = 0;
foreach ($intmac_ids as $value) {
        echo $value[$unique_mac_id[$i++]];
}

Вывод, который я ищу, выглядит так:

Array
    (
        [0] => Array ( [536870923] => 34213905 )
        [1] => Array ( [536870923] => 34213913 )
        [2] => Array ( [536870925] => 34213897 )
        [3] => Array ( [536870925] => 34218049 )
        [4] => Array ( [536870926] => 34213929 )
        [5] => Array ( [536870928] => 34213921 )
        [6] => Array ( [536870929] => 34218057 )
        [7] => Array ( [536870918] => 34218041 )
        [8] => Array ( [536870919] => 34213937 )
        [9] => Array ( [536870920] => 34218065 )
        [10] => Array ( [536870920] => 34218073 )
    )

1 Ответ

0 голосов
/ 16 января 2019

Вы можете использовать usort() для $array1 и передавать $array2 в качестве массива поиска порядка сортировки.

Код: ( Демо )

$array1 = [
    [536870914 => 34213897],
    [536870914 => 34213905],
    [536870915 => 34213921],
    [536870914 => 34213913],
    [536870915 => 34213929],
    [536870917 => 34213937],
    [536870925 => 34218049],
];

$array2 = [
    536870925,
    536870914,
    536870915,
    536870917,
];

usort($array1, function($a, $b) use ($array2) {
    return array_search(key($a), $array2) <=> array_search(key($b), $array2);
});

var_export($array1);

Чтобы сделать этот процесс более эффективным, переверните поисковый массив заранее.

Код: ( Демо )

$array2 = array_flip($array2);

usort($array1, function($a, $b) use ($array2) {
    return $array2[key($a)] <=> $array2[key($b)];
});

var_export($array1);

Если некоторые идентификаторы из массива1 не представлены в массиве2, вам необходимо определить, как эти выбросы должны быть отсортированы. Если вы не откорректируете пропущенные значения в массиве поиска, вы создадите уведомления и получите неожиданный результат сортировки.

Вот аналогичный пост, который предлагает некоторые рекомендации по этому вопросу:

https://stackoverflow.com/a/52754080/2943403

...