【问题标题】:How to combine 2 arrays based on same value of same key如何基于相同键的相同值组合2个数组
【发布时间】:2018-03-15 19:07:58
【问题描述】:

我想基于相同的键/值对合并/组合 2 个数组。

更清楚地说,我正在寻找的是一种在 MySQL 中已知的连接函数。第一个数组应该由第二个数组“加入”,基于 ID,即键/值对“名称”。

我该怎么做?

1.阵列

 [0] => Array
        (
            [name] => first
            [logo] => url
            [cat] => abc
        )
[1] => Array
        (
            [name] => second
            [logo] => url
            [cat] => abc
        )

2。阵列

 [0] => Array
        (
            [name] => first
            [menu] => true
            [key] => value
        )

新阵列(扩展结果):

[0] => Array
       (
           [name] => first
           [logo] => url
           [cat] => abc
           [menu] => true
           [key] => value
       )

如您所见,这是不言自明的。在这种情况下,'name' 键就像一个 ID(对于两个数组)。

【问题讨论】:

  • 更清楚一点:我正在搜索的是 MySQL 中已知的一种连接函数。第一个数组应该由第二个数组“连接”,基于 ID,即键/值对“名称”

标签: php arrays merge


【解决方案1】:

如果您首先按名称重新索引第二个数组,则从中获取这些值会更容易。

$second = array_column($second, null, 'name');

(如果 'name' 在数组中是唯一的,则可以这样做。我假设是这种情况,因为您说它“就像一个 ID”。如果 'name' 不是唯一的,那么当你重新索引,因为数组键必须是唯一的。)

然后迭代你的第一个数组并将第二个数组中的任何对应值合并到结果中。

foreach ($first as $key => $value) {
    if (isset($second[$value['name']])) {
        $result[$key] = array_merge($value, $second[$value['name']]);
    }
}

这就像 SQL 中的内连接,其中结果将仅包括值存在于两个表中的行。如果您希望它更像左连接,那么如果在第二个数组中找不到匹配的名称值,则需要为第二个数组中的键合并一组空值。

foreach ($first as $key => $value) {
    if (isset($second[$value['name']])) {
        $result[$key] = array_merge($value, $second[$value['name']]);
    } else {
        $result[$key] = array_merge($value, ['menu' => null, 'key' => null]);
    }
}

Working example at 3v4l.org.

【讨论】:

  • 谢谢,但有些值会丢失,例如“logo”,此外,“看起来您希望结果只包含两个数组中都存在的名称”...不,那不是我想要的想。基本上,第一个数组很重要,第二个应该只添加额外的键/值。
  • @Dave18 更新了答案。我添加了一个可执行示例的链接。如果我仍然没有正确理解,请告诉我。
【解决方案2】:

试试这个

$mergedArray = array_merge_recursive ($firstArray,$secondArray);

$newArray = [];
foreach( $mergedArray as $subArr ) {
    $newArray = array_merge($subArr,$newArray);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多