array_diff с расчетом - PullRequest
       69

array_diff с расчетом

0 голосов
/ 12 апреля 2020

Пожалуйста, рассмотрите следующие массивы:

$reference = array(
    '080604' => 4,
    '080703' => 4,
    '080734' => 2,
    '080819' => 2,
    '088341' => 2,
    '805238' => 20,
    '805283' => 4,
    '805290' => 2,
    '805849' => 2,
    '806051' => 2,
    '806068' => 2,
);

$test = array(
    '080604' => 2,
    '080703' => 4,
    '080819' => 1,
    '088341' => 2,
    '805238' => 20,
    '805283' => 4,
    '805290' => 2,
    '805849' => 2,
    '806051' => 2,
    '806068' => 2,
);

Они очень похожи, но могут иметь некоторые различия, например, возможно, что: - некоторые ключи $ reference вообще отсутствуют в $ test - некоторые ключи $ test вообще отсутствуют в $ reference - присутствуют все ключи, но значения в $ reference и $ test различаются (иногда значение $ reference больше, чем $ test, а иногда значение $ test больше чем $ reference)

Мне нужно автоматически найти различия и вывести их таким образом, чтобы не только разница в подсчете, но и описание, например,

$result = [
   '080604' => [
       'reference' => 4,
       'test' => 2
   ]
];

Если какое-то значение присутствует только в одном из списков:

$result = [
   '1234567890' => [
       'reference' => 0,
       'test' => 2
   ]
];

или что-то в этом роде.

Есть ли у кого-то идея, которая является лучшим способом достижения sh этого элегантно? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Итерируйте по каждому и заполняйте массив значениями, если они присутствуют:

$combined = [];

foreach ($reference as $key => $val) {
    $combined[$key] = [
        'test' => 0,
        'reference' => $val,
    ];
}

foreach ($test as $key => $val) {
    if (!isset($combined[$key])) {
        $combined[$key] = [
            'reference' => 0,
            'test' => 0,
        ]
    }

    $combined[$key]['test'] = $val;
}

$combined будет содержать оба значения из обоих массивов со ссылкой на оба элемента из $reference и $test.

0 голосов
/ 12 апреля 2020

попробуй

$result = array_diff($reference, $test);
print_r($result)
...