【问题标题】:Codeigniter - merge multiple associative array with conditionCodeigniter - 将多个关联数组与条件合并
【发布时间】:2018-05-15 11:42:47
【问题描述】:

我需要将多个数组合并为一个特定键及其值相同的数组。这是 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 这个链接上给出的答案并没有解决目的,它为每个新键制作不同的数组,而我需要将新键附加到一个数组中。

【问题讨论】:

  • 做一些 foreach 循环。
  • 所有子数组中都存在“b”索引吗?
  • @NeilPatrao 是的,“b”很常见
  • 好的。然后我的answer 应该可以工作了。

标签: php arrays codeigniter merge associative-array


【解决方案1】:

假设您在所有子数组中都有 "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);

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

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

【讨论】:

  • 在这个问题中,是否可以合并非空值。意味着如果两个数组中的几个键相同且其中一个值为空,则保留不为空的值。
  • 您可以将sub_arrays 过滤为空值,然后合并。检查更新的答案。
  • 这很好,但它也删除了具有空值的键...$array1 = array(); $array1[] = array("a" => "m1", "b" => "x2", "c" => null, "d" => "null"); $array2 = array(); $array2[] = array("a" => null, "b" => "x2", "c" => null, "d" => "q1"); 需要输出为array("a" => m1, "b" => "x2", "c" => null, "d" => "q1");
  • 这里的键数在所有数组段中都是相同的。由于该数组将通过codeigniter PHPExcel导出为Excel工作表,因此无法从任何数组中删除任何键。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    创建了与您类似的数组。 $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);
    

    【讨论】:

      【解决方案4】:
      // 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-26
        • 2018-04-18
        • 2016-09-28
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多