将第二个数组合并到第一个数组中,其中第一个数组的行值与第二个数组中的行键匹配。

4
我希望将第二个数组中与第一维数组的 "epg_channel_id" 值匹配的子数组的关联元素合并到第一个数组中。
第一个数组:
[
    [
        'num' => 1,
        'name' => 'name 1',
        'epg_channel_id' => 'ch111',
        'added' => '1505435915',
    ],
    [
        'num' => 2,
        'name' => 'name 2',
        'epg_channel_id' => 'ch222',
        'added' => '1505435915',
    ],
    [
        'num' => 3,
        'name' => 'name 3',
        'epg_channel_id' => 'ch333',
        'added' => '1505435915',
    ],
    [
        'num' => 4,
        'name' => 'name 4',
        'epg_channel_id' => 'ch444',
        'added' => '1505435915'
    ]
]

第二个数组:

[
    ['ch000' => 'Um9jayBJbiBSaW8='],
    ['ch111' => 'Um9jayBJbiBSaW8='],
    ['ch222' => 'Um9jayBJbiBSaW8='],
    ['ch333' => 'Um9jayBJbiBSaW8='],
    ['ch444' => 'Um9jayBJbiBSaW8=']
]

期望的输出结果(一行):
Array
(
  [0] => Array
  (
    [num] => 1
    [name] => name 1
    [epg_channel_id] => ch111
    [added] => 1505435915
    [ch111] => Um9jayBJbiBSaW8= 
  )
  ...
)

我尝试使用array_recursive和array_merge,但它们都无法正常工作。


你有两个二维数组,想要合并它们的元素? - Salim Ibrohimi
2
你应该使用循环。 - Salim Ibrohimi
你的第一个数组有4个元素,而第二个数组有5个元素?这是一个错误吗,还是其中一个比另一个多? - kojow7
通道ID是否总是在相同的索引中?例如,array1的索引0是否保证具有与array2的索引0相同的通道ID? - kojow7
8个回答

2

如果两个数组中对应的索引保证具有相同的频道ID,则这种方法效率非常高。例如,如果$array1 [0]保证具有与$array2 [0]相同的频道ID,则此解决方案将有效:

$combined = [];
foreach($array1 as $key=>$val){
    $combined[$key] = $val + $array2[$key];
}

然而,如果对应的索引没有保证具有相同的通道ID,则此解决方案将无法正常工作,您需要使用其他发布的答案之一。最后要注意的是,如果数组大小不同,则希望最大的数组为$array1。因此,只需进行比较以查看哪个具有最多的元素即可。

1
OP想要将第一个数组的epg_channel_id与第二个数组的键匹配。这样做不会产生期望的结果。 - B. Desai
@B.Desai 是的,在重新阅读后,您可能是正确的。我已经在我的回答中添加了免责声明。 :) - kojow7

1

您需要循环遍历两个数组才能获得所需的结果:因为您需要将第一个数组的epg_channel_id与第二个数组的内部键匹配。

$arr1 = Array
 (
 0 => Array
    (
        "num" => 1,
        "name" => "name 1",
        "epg_channel_id" => "ch111",
        "added" => "1505435915",
    ),
1 => Array
    (
        "num" => 2,
        "name" => "name 2",
        "epg_channel_id" => "ch222",
        "added" => "1505435915",
    ),
2 => Array
    (
        "num" => 3,
        "name" => "name 3",
        "epg_channel_id" => "ch333",
        "added" => "1505435915",
    ),
3 => Array
    (
        "num" => 4,
        "name" => "name 4",
        "epg_channel_id" => "ch444",
        "added" => "1505435915",
    ),
);
$arr2 = Array
 (
 0 => Array
    (
        "ch000" => "Um9jayBJbiBSaW8="
    ),
1 => Array
    (
        "ch111" => "Um9jayBJbiBSaW8="
    ),
2 => Array
    (
        "ch222" => "Um9jayBJbiBSaW8="
    ),
3 => Array
    (
        "ch333" => "Um9jayBJbiBSaW8="
    ),
4 => Array
    (
        "ch444" => "Um9jayBJbiBSaW8="
    ),
);
$new_array = array();
foreach($arr1 as $key=>$value)
{
    foreach($arr2 as $key1=>$value1)
    {
        foreach($value1 as $key2=>$value2)
        {
            if($key2 == $value['epg_channel_id'])
            {
                $value[$key2]=$value2;
            }
        }
    }
    $new_array[$key]=$value;
}
print_r($new_array);

DEMO

的英译为:

{{链接1:演示}}


是的,但是最后一个循环也会每次迭代一次,因为它只有一个元素。 - B. Desai

1
你可以使用array_key_exists在第二个数组中检查键是否存在,然后将其添加到新数组中。 工作演示: https://eval.in/863359
$array = Array
(
    Array
    (
        'num' => 1,
        'name' => 'name 1',
        'epg_channel_id' => 'ch111',
        'added' => '1505435915',
    ),

    Array
    (
        'num' => 2,
        'name' => 'name 2',
        'epg_channel_id' => 'ch222',
        'added' => '1505435915',
    ),

    Array
    (
        'num' => 3,
        'name' => 'name 3',
        'epg_channel_id' => 'ch333',
        'added' => '1505435915',
    ),

    Array
    (
        'num' => 4,
        'name' => 'name 4',
        'epg_channel_id' => 'ch444',
        'added' => '1505435915'

    )
);
$array2 = Array
(
    Array
    (
        'ch000' => 'Um9jayBJbiBSaW8='
    ),

    Array
    (
        'ch111' => 'Um9jayBJbiBSaW8='
    ),

    Array
    (
        'ch222' => 'Um9jayBJbiBSaW8='
    ),

    Array
    (
        'ch333' => 'Um9jayBJbiBSaW8='
    ),

    Array
    (
        'ch444' => 'Um9jayBJbiBSaW8='
    )
);

$newArray =[];
foreach ($array as $key => $value) {
    foreach ($array2 as $key2 => $value2) {
        if (array_key_exists($value['epg_channel_id'], $value2)) {
            $value[$value['epg_channel_id']] = $value2[$value['epg_channel_id']];
        }
    }
    $newArray[] = $value;
}

echo "<pre>"; 
print_r($newArray);

0
尝试从array1中读取'epg_channel_id'的值,并将其插入到array1本身中,从array2获取'ch111'。
$ch_name = $array1[$i]['epg_channel_id'];
$id = $array1[$i]['num'];

$ch_value = $array2[$id]['$ch_name'];

$array1[$i]["$ch_name"] =  $ch_value;

尝试为每个数组使用foreach。

它是一个多维数组,你不能像这样访问。 - Jigar Shah
尝试编辑代码。我没有注意到多维数组。 - Anu

0

试试这个。我希望它能解决你的问题。我已经测试过了。

foreach ($array1 as $key => $value){
       // echo $key;
        foreach ($array2 as $i =>$item){
            foreach ($item as $j=>$subitem){
                if($value['epg_channel_id'] == $j){
                    $array1[$key][$j] = $subitem;
            }
            }
        }
    }


print_r($array1);

0
$new_arr = [];
foreach($arr1 as $val){
    foreach($arr2 as $val2){
        if(array_key_exists($val['epg_channel_id'], $val2)){
            $val[$val['epg_channel_id']] = $val2[$val['epg_channel_id']];
            break;
        }
    }
    $new_arr[] = $val;
}
print_r($new_arr);

0

坏消息是你的第二个数组结构不适合作为查找数组。好消息是将结构展平为简单的关联数组的步骤非常容易。

一旦声明了查找,只需使用循环并通过引用修改,就可以使用数组联合语法附加所需的键值对。

我不建议使用嵌套循环的任何答案--它们的性能不高效。

代码:(演示)

$lookup = array_merge(...$array2);
foreach ($array as &$row) {
    $row += [$row['epg_channel_id'] => $lookup[$row['epg_channel_id']]];
}
var_export($array);

0

array_merge_recursive对于键为字符串的关联数组效果很好。数字键将被追加。来自php.net

如果输入数组具有相同的字符串键,则这些键的值将合并到一个数组中,并且这是递归完成的,因此如果其中一个值本身就是一个数组,则该函数将把它与另一个数组中的相应条目合并。但是,如果数组具有相同的数字键,则后面的值不会覆盖原始值,而是将被追加。

您必须将数组转换为字符串键,或使用一个循环逐个合并子数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接