代码之家  ›  专栏  ›  技术社区  ›  André Castro

PHP比较多维数组

  •  0
  • André Castro  · 技术社区  · 7 年前

    这很难解释,所以请原谅我,如果它不是水清澈。。。

    第一个和第二个数组是相同的,所以这里只放一个:

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

    第一个将通过表单$\u POST发送的值发送到API,标签以“EN”语言发送。

    但是,第二个将值发送到mysql数据库,并且标签必须以“PT”语言发送。第二个数组只能将标签从EN改为PT。其余字段值必须与第一个数组发送到外部API的值相同。

    我试图比较这两个数组,并根据第一个数组发送给API的内容只将标签键转换为PT。

    例子: 第二个数组必须有:“code”=>“video”,labels=>“PT”

    我被工作困住了。。。任何帮助,请。。。

    1 回复  |  直到 7 年前
        1
  •  0
  •   1gor    7 年前

    这里有一个小班给你:

    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)
        );
    }