PHP сравнивает многомерные массивы - PullRequest
0 голосов
/ 16 сентября 2018

Это трудно объяснить, так что прости меня, если вода не чиста ...

У меня есть 2 идентичных ассоциативных массива.

Первый и второй массивы идентичны, поэтому я поставил здесь только один:

"parameters": [
            {
                "code": "video",
                "type": "input",
                "labels": {
                    "pt": "Vídeo Youtube",
                    "en": "Youtube video"
                },
                "required": false,
                "purpose": "add",
                "options": null
            }
];

Первая отправляет значения, которые приходят через форму $ _POST в API, а метки отправляются на языке "EN".

Но, второй отправляет значения в базу данных mysql, и метки должны отправляться на языке «PT». Этот второй массив должен изменять только метки с EN на PT. Остальные значения полей должны совпадать с тем, что первый массив отправляет во внешний API.

Я пытаюсь сравнить оба массива и изменить только перевод ключа меток на PT на основе того, что первый массив отправляет в API.

Пример: первый массив имеет: "code" => "video", метки => "EN" второй массив должен иметь: «code» => «video», метки => «PT»

Я застрял, пытаясь сделать с работой ... любую помощь, пожалуйста ...

1 Ответ

0 голосов
/ 17 сентября 2018

вот небольшой класс для вас:

class ArrayDiffer
{
public static function recursiveDiff(array $firstArray, array $secondArray): array
{
    $difference = [];

    foreach ($firstArray as $key => $value) {
        if (\array_key_exists($key, $secondArray)) {
            if (\is_array($value)) {
                $recursiveDiff = self::recursiveDiff($value, $secondArray[$key]);
                if (\count($recursiveDiff)) {
                    $difference[$key] = $recursiveDiff;
                }
            } else {
                if ($value != $secondArray[$key]) {
                    $difference[$key] = $value;
                }
            }
        } else {
            $difference[$key] = $value;
        }
    }

    return $difference;
}
}

и вот тест, который демонстрирует, как он работает:

public function testDiff(): void
{
    $arrayDiffer = new ArrayDiffer();

    $firstArray  = \json_decode(
        '[{
            "code": "video",
            "type": "input",
            "labels": {
                "en": "Youtube video"
            },
            "required": false,
            "purpose": "add",
            "options": null
        }]', true
    );
    $secondArray = \json_decode(
        '[{
            "code": "video",
            "type": "input",
            "labels": {
                "pt": "Vídeo Youtube"
            },
            "required": false,
            "purpose": "add",
            "options": null
        }]', true
    );

    $this->assertEquals(
        [
            0 => [
                'labels' => [
                    'en' => 'Youtube video',
                ],
            ],
        ],
        $arrayDiffer::recursiveDiff($firstArray, $secondArray)
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...