Codeigniter - 将多个关联数组与条件合并

时间:2017-12-01 11:14:42

标签: php arrays codeigniter merge associative-array

我需要将多个数组合并为一个特定键和一个数组。它的价值是一样的。这是Sample_Array1

array(n) {
[0]=> array {
 ["a"]=> "m1"
 ["b"]=> "x2"
}
[1]=> array {
 ["a"]=> "n1"
 ["b"]=> "y2"
} ....

Sample_Array2,带有一个公共密钥&其他不同的。

array(n) {
[0]=> array {
 ["b"]=> "x2"
 ["c"]=> "p1"
}
[1]=> array {
 ["b"]=> "x2"
 ["d"]=> "q1"
}
[2]=> array {
 ["b"]=> "y2"
 ["e"]=> "r1"
} ....

需要将Sample_Array2合并/附加到Sample_Array1,其中key-“b”&它的价值是一样的。预期产出:

array(n) {
[0]=>
array(2) {
 ["a"]=> "m1"
 ["b"]=> "x2"
 ["c"]=> "p1"
 ["d"]=> "q1"
}
[1]=>
array(2) {
 ["a"]=> "n1"
 ["b"]=> "y2"
 ["e"]=> "r1"
} ....  

我尝试了很多类似的问题,却找不到确切的结果。 PHP merge arrays with a condition在这个链接上给出的答案是没有解决目的,它为每个新密钥创建了不同的数组,而我需要将新密钥附加到一个数组中。

4 个答案:

答案 0 :(得分:0)

我真的不知道你想在这里实现什么 - 但根据你的描述,以下代码可以正常工作

$arrA = [
    0   =>
    [
        'a' => 'm1',
        'b' => 'x2'
    ],
    1   =>
    [
        'a' => 'n1',
        'b' => 'y2'
    ]
];

$arrB = [
    0 =>
    [
        'b' => 'x2',
        'c' => 'p1',
    ],
    1 =>
    [
        'b' => 'x2',
        'd' => 'q1',
    ],
    2 =>
    [
        'b' => 'y2',
        'e' => 'r1',
    ],
];

foreach($arrB AS $arrData)
{
    foreach($arrData AS $key => $val)
    {
        if ((isset($arrData['a']) && $arrData['a'] == $arrA[0]['a']) || (isset($arrData['b']) && $arrData['b'] == $arrA[0]['b']))
        {
            $arrA[0][$key] = $val;
        }
        elseif ((isset($arrData['b']) && $arrData['b'] == $arrA[1]['a']) || (isset($arrData['b']) && $arrData['b'] == $arrA[1]['b']))
        {
            $arrA[1][$key] = $val;
        }
    }
}

print_r($arrA);

答案 1 :(得分:0)

这应该有效,假设你在所有子数组中都有"b"索引。

$array1 = array();
$array1[] = array("a" => "m1", "b" => "x2", "c" => null);
$array1[] = array("a" => "n1", "b" => "y2");

$array2 = array();
$array2[] = array("b" => "x2", "c" => "p1");
$array2[] = array("a" => null, "b" => "x2", "d" => "q1");
$array2[] = array("b" => "y2", "e" => "r1");



function merge_on_key($array1, $array2, $key) {
    $result_array = array();
    foreach($array1 as $key1 => $sub_array1) {
        $merged_array = array();
        $sub_array1  = array_filter($sub_array1);
        foreach($array2 as $key2 => $sub_array2) {
            $sub_array2  = array_filter($sub_array2);
            if($sub_array1[$key] == $sub_array2[$key]) {
                $merged_array = array_merge($sub_array1, $sub_array2, $merged_array);
                unset($array2[$key2]);
            }
        }
        if (!empty($merged_array)) {
            $result_array[] = $merged_array;
        }
    }
    return array_merge($result_array, $array2);
}

$final_array = merge_on_key($array1, $array2, "b");

print_r($final_array);

如果您还必须匹配"b"内的$array1索引,那么只需使用它两次:

$array1 = merge_on_key($array1, $array1, "b");
$final_array = merge_on_key($array1, $array2, "b");

答案 2 :(得分:0)

创建与您类似的数组。 $new_array是您要查找的结果数组。

$a=array();

$a[0]=array('a'=>'m1', 'b'=>'x2');
$a[1]=array('a'=>'n1', 'b'=>'y2');

$b=array();
$b[0]=array('b'=>'x2', 'c'=>'p1');
$b[1]=array('b'=>'x2', 'd'=>'q1');
$b[2]=array('b'=>'y2', 'e'=>'r1');


foreach($a as $row){
    //echo '<pre>'; print_r($row);
    foreach($b as $c=>$row1){
        //echo '<pre>'; print_r($row1);echo $c;die;
    if($row['b']==$row1['b']){
        $new_array[]=array_merge($row, $row1);

    }
    }

}echo '<pre>'; print_r($new_array);

答案 3 :(得分:0)

// Gather all values of b from both arrays
$all_b = array_unique(array_merge(array_column($arr1, 'b'), array_column($arr2, 'b')));

$res = [];

// For each b value
foreach($all_b as $b) {
     $temp = [];
     // Scan the arrays for items with the same b value
     foreach($arr1 as $a1) {
        if ($a1['b'] == $b) $temp = array_merge($temp, $a1);
     }
     foreach($arr2 as $a2) {
        if ($a2['b'] == $b) $temp = array_merge($temp, $a2);
     }
     // Save them to new array
     $res[] = $temp; 
}

print_r($res);

demo on eval