Заполнить пробелы в новом массиве на основе массивов различной длины - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать один массив из двух.Два массива могут иметь разную длину, поэтому результат объединения должен учитывать это и заполнять пробелы с помощью null.

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

Это то, что я сделал до сих пор, но это кажется очень неуклюжим, и я начинаю думать - должен быть лучший способ - меньше циклов и, возможно, использованиенекоторые из методов помощников массива php?

<?php

$result_keys = [];

$result_data = [];

$bigger = null;

$smaller = null;

$array1 = [
        [
            'dog' => 2,
            'cat' => 3,
        ],
        [
            'dog' => 4,
            'cat' => 2,
        ],
        [
            'dog' => 2,
            'cat' => 3
        ]
    ];

$array2 = [
        [
            'bird' => 7,
        ],
        [
            'bird' => 5
        ]
    ];

// find which array is bigger
if (count($array1) >= count($array2)) {
  $bigger = $array1;
  $smaller = $array2;
} else {
  $bigger = $array2;
  $smaller = $array1;
};

// loop over bigger array
foreach ($bigger as $i => $record) {

    foreach ($record as $key => $value) {
        if ($i === 0) {
            $result_keys[] = $key;
        };
        $result_data[$i][] = $value;
    }

 // fill gaps in smaller array    
    if (!isset($smaller[$i])) {
        foreach ($smaller[$i-1] as $key => $value) {
            $smaller[$i][$key] = null;
        }
    }

};

// loop over smaller array
foreach ($smaller as $i => $record) {
    foreach ($record as $key => $value) {
        if ($i === 0) {
            $result_keys[] = $key;
        };
        $result_data[$i][] = $value;
    }  
};

var_dump($result_keys);
var_dump($result_data);


// // expected result
// $result_keys = ['dog', 'cat', 'bird'];

// $result_data = [
//     [2,3,7],
//     [4,2,5],
//     [2,3,null]
// ];

1 Ответ

1 голос
/ 24 сентября 2019

Мое решение вашей проблемы:

$array1 = [
    [
        'dog' => 2,
        'cat' => 3,
    ],
    [
        'dog' => 4,
        'cat' => 2,
    ],
    [
        'dog' => 2,
        'cat' => 3
    ]
];

$array2 = [
    [
        'bird' => 7,
    ],
    [
        'bird' => 5
    ]
];

// get the number of values of the biggest array
$count = $count = count($array1) >= count($array2) ? count($array1) : count($array2);

$values = [];
$keys   = [];
for ($i = 0; $i < $count; $i++) {
    $a1       = $array1[$i] ?? [];
    $a2       = $array2[$i] ?? [];
    $keys     = array_unique(array_merge($keys, array_keys($a1), array_keys($a2)));
    $values[] = array_values(array_merge(array_fill_keys($keys, null), $a1, $a2));
}

print_r($keys);
print_r($values);

Результаты (тест здесь ):

Array
(
    [0] => dog
    [1] => cat
    [2] => bird
)
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 7
        )

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

    [2] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...