【问题标题】:Join 2 arrays by key按键加入 2 个数组
【发布时间】:2016-07-09 04:47:59
【问题描述】:

假设我有 2 个数组:

$arr1 = array (
        array (
                "animal" => "cat",
                "color" => "grey" 
        ),
        array (
                "animal" => "dog",
                "color" => "black" 
        ),
        array (
                "animal" => "mouse",
                "color" => "white" 
        ) 
);

$arr2 = array (
        array (
                "title" => "mouse",
                "name" => "Abby" 
        ),
        array (
                "title" => "dog",
                "name" => "Rex" 
        ),
        array (
                "title" => "dog",
                "name" => "Barney" 
        ),
        array (
                "title" => "mouse",
                "name" => "Georgie" 
        ) 
);

我现在想通过密钥加入他们(animal 来自$arr1title 来自$arr2)所以我有:

$arr1 = array (
        array (
                "animal" => "cat",
                "color" => "grey" 
        ),
        array (
                "animal" => "dog",
                "color" => "black",
                "name" => "Rex",
                "name" => "Barney" 
        ),
        array (
                "animal" => "mouse",
                "color" => "white",
                "name" => "Abby",
                "name" => "Georgie" 
        ) 
);

所以只需从$arr2 中添加dogmouse 的名称。

我的解决方案是:

foreach ( $arr1 as $key1 => $entry1 ) {
    foreach ( $arr2 as $key2 => $entry2 ) {
        if ($entry1 ["animal"] == $entry2 ["title"]) {
            $arr1 [$key1] ["name"] = $entry2 ["name"];
        }
    }
}

但它会覆盖第一个条目,所以我只能得到姓氏:

$arr1 = array (
        array (
                "animal" => "cat",
                "color" => "grey" 
        ),
        array (
                "animal" => "dog",
                "color" => "black",
                "name" => "Barney"
        ),
        array (
                "animal" => "mouse",
                "color" => "white",
                "name" => "Georgie"
        ) 
);

我查看了array_merge(),但它只是合并数组而不比较它们的键。

【问题讨论】:

  • 您不能在地图中多次使用同一个键。 Halayem Anis 的解决方案建议在单个“名称”键后面使用一个数组,这是一个很好的解决方案。
  • 只需更新您的代码$arr1 [$key1] ["name"][] = $entry2 ["name"];,因为您不能拥有相同的键名
  • @Uchiha:哇,这很容易!
  • 不客气。很高兴它对您有所帮助。

标签: php arrays join merge


【解决方案1】:

所以名称索引必须是一个数组:)

尝试如下

foreach ( $arr1 as $key1 => $entry1 ) {
    foreach ( $arr2 as $key2 => $entry2 ) {
        if ($entry1 ["animal"] == $entry2 ["title"]) {
            if (!isset($arr1[$key1]["name"])) {
                $arr1[$key1]["name"] = array();
            }
            $arr1 [$key1]["name"][] = $entry2 ["name"];
        }
    }
}

输出

$arr1 = array (
            array (
                    "animal" => "cat",
                    "color" => "grey" 
            ),
            array (
                    "animal" => "dog",
                    "color" => "black",
                    "name" => ["Rex", "Barney" ] 
            ),
            array (
                    "animal" => "mouse",
                    "color" => "white",
                    "name" => ["Abby", "Georgie"]
            ) 
);

【讨论】:

  • 很好的解决方案,既适用于使用数组,也适用于在尚未设置密钥时使用正确的初始化。
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 2013-05-16
  • 2022-10-07
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多