Переиндексировать и отсортировать многомерный массив PHP - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь повторно проиндексировать и отсортировать многомерный массив PHP, имея в виду, что если некоторые из внутренних массивов не имеют определенного индекса, а другие имеют, мы хотим просто перейти к следующему индексу в этом конкретный внутренний массив

Например, исходный массив ниже не имеет индекса массива 4 в subject_1 и subject_3, но имеет его в subject_2

            Array
            (
            [subject_1] => Array
            (
            [2] => a
            [6] => b
            )

            [subject_2] => Array
            (
            [2] => c
            [4] => d
            [6] => e
            )

            [subject_3] => Array
            (
            [2] => f
            [6] => g
            )
            )

Итак, массив ожидаемых результатов должен быть примерно таким, как показано ниже

            Array
            (
            [subject_1] => Array
            (
            [0] => a
            [2] => b
            )       
            [subject_2] => Array
            (
            [0] => c
            [1] => d
            [2] => e
            )

            [subject_3] => Array
            (
            [0] => f
            [2] => g
            )
            )
            )
            )

Проблема с приведенным ниже кодом заключается в том, что он знает, существует ли индекс на всех подмассивах перед сортировкой.

            $all_incoming_keys = array();
            foreach($p2 as $key => $value){
            $all_incoming_keys[] = $key;
            }
            for($sp2 = 0; $sp2 < count($p2); $sp2++){
            sort($p2[$all_incoming_keys[$sp2]]);
            array_values($p2[$all_incoming_keys[$sp2]]);
            } 

Этот код является правильным подходом для ситуации или является там функция, которую мне не хватает

1 Ответ

0 голосов
/ 07 мая 2020

Чтобы иметь возможность переиндексировать ключи в зависимости от позиции списка уникальных ключей, вам сначала нужно определить этот порядок. Этот код проходит через все предметы и объединяет все ключи в 1 массив ($all_incoming_keys). Затем это обрабатывается для создания уникального списка ключей (в числовом порядке) и создается список со связанной позицией.

$all_incoming_keys = [];
// Extract all of the keys
foreach ( $a as $subjects ) {
    $all_incoming_keys = array_merge ($all_incoming_keys, array_keys($subjects));
}
sort($all_incoming_keys);
// Create sequential list of different values
$all_incoming_keys = array_flip(array_values(array_unique($all_incoming_keys)));
print_r($all_incoming_keys);

Это дает ...

Array
(
    [2] => 0
    [4] => 1
    [6] => 2
)

Второй затем снова проходит через субъектов и копирует значение для каждого элемента в новый массив с ключом из приведенного выше списка ...

$newA = [];
foreach ( $a as $subjectName => $subjects ) {
    foreach ( $subjects as $key => $subject ){
        $newA[$subjectName][$all_incoming_keys[$key]] = $subject;
    }
}

print_r($newA);

Что в вашем примере должно дать ...

Array
(
    [subject_1] => Array
        (
            [0] => a
            [2] => b
        )

    [subject_2] => Array
        (
            [0] => c
            [1] => d
            [2] => e
        )

    [subject_3] => Array
        (
            [0] => f
            [2] => g
        )

)
...