【问题标题】:Array Merge from multidimensional Array多维数组的数组合并
【发布时间】:2019-02-25 07:35:39
【问题描述】:

我想将多维数组合并为单个数组。 我想知道有没有php built in array_function 可以做到这一点。我不想使用任何循环,因为我有来自导入文件的数据。可能有超过数千条记录。

我在这段代码下面生成这个数组:

$insert = array();
foreach ($data as $key => $value) {
   $insert[$key][] = [
        'name' => $value->name,
        'email' => $value->email,
        'mobile_no' => $value->mobile_no,
        'password' => bcrypt($value->password),
        'user_type_id' => $value->user_type_id,
        'designation' => $value->designation,

        $this->userTypeWiseFieldGenerateForImportInsert($value)
    ];
}

而我的回调函数是

public function userTypeWiseFieldGenerateForImportInsert($data){
    if($data->user_type_id == 1){
        $insertArray['market_code'] = $data->market_code;
        $insertArray['product_code'] = $data->product_code;
        $insertArray['territori_code'] = $data->territori_code;
        $insertArray['region_code'] = $data->region_code;
        $insertArray['division_code'] = $data->division_code;
    }elseif($data->user_type_id == 2){
        $insertArray['territori_code'] = $data->territori_code;
        $insertArray['region_code'] = $data->region_code;
        $insertArray['division_code'] = $data->division_code;
    }elseif($data->user_type_id == 3){
        $insertArray['region_code'] = $data->region_code;
        $insertArray['division_code'] = $data->division_code;
    }elseif($data->user_type_id == 4){
        $insertArray['division_code'] = $data->division_code;
    }

    return $insertArray;
}

我得到了这个数组:

Array(
  [0] => Array
      (
          [name] => Md. XXXX
          [email] => abc@gmail.com
          [mobile_no] => 1751017812
          [password] => $2y$10$6Vmr61t896IxfJ1A0pxX5Of1hnfUVX9blmdmclAxt56cMd754NkDC
          [user_type_id] => 1
          [designation] => Sr. Software Engineer
          [0] => Array
              (
                  [market_code] => mirpurA203
                  [product_code] => Seclo201
                  [territori_code] => T352
                  [region_code] => Mirpur334
                  [division_code] => Dhaka31
              )
      )

  [1] => Array
      (
          [name] => Md. XX
          [email] => def@gmail.com
          [mobile_no] => 1761017812
          [password] => $2y$10$62fwqiAmrv.Jc89i5L3YNuMpcYeFVrpqewuBPKYIgmXiX/9sGRC/S
          [user_type_id] => 2
          [designation] => Sr. Software Engineer
          [0] => Array
              (
                  [territori_code] => T352
                  [region_code] => Mirpur334
                  [division_code] => Dhaka31
              )
      )
) 

我希望制作单个数组,如下所示:

Array(
[0] => Array
    (
        [name] => Md. XXXX
        [email] => abc@gmail.com
        [mobile_no] => 1751017812
        [password] => $2y$10$6Vmr61t896IxfJ1A0pxX5Of1hnfUVX9blmdmclAxt56cMd754NkDC
        [user_type_id] => 1
        [designation] => Sr. Software Engineer
        [market_code] => mirpurA203
        [product_code] => Seclo201
        [territori_code] => T352
        [region_code] => Mirpur334
        [division_code] => Dhaka31
    )

[1] => Array
    (
        [name] => Md. XX
        [email] => def@gmail.com
        [mobile_no] => 1761017812
        [password] => $2y$10$62fwqiAmrv.Jc89i5L3YNuMpcYeFVrpqewuBPKYIgmXiX/9sGRC/S
        [user_type_id] => 2
        [designation] => Sr. Software Engineer
        [territori_code] => T352
        [region_code] => Mirpur334
        [division_code] => Dhaka31
    )
)

【问题讨论】:

  • 你有没有尝试过?或者在 SO 上搜索?也许这可以帮助你https://stackoverflow.com/questions/1558291/php-merge-2-multidimensional-arrays
  • 你尝试了什么?
  • @Sfili_81 感谢您的评论我想要一些没有 for 循环的数组函数
  • @MayankVadiya 我没有尝试任何我想要的函数中的一些数组,因为我有 1000 行所以我无法循环遍历这个
  • 嵌套数组[0] => Array 是否总是且只有零?或者还有更多?为什么不使用 foreach?

标签: php arrays laravel


【解决方案1】:

修复您的原始导入...

您的子函数 (userTypeWiseFieldGenerateForImportInsert()) 首先将子数组添加到数据中,您可以改为从初始数据创建一个部分,然后合并来自此函数调用的附加数据...

foreach ($data as $key => $value) {
    $newData = [
        'name' => $value->name,
        'email' => $value->email,
        'mobile_no' => $value->mobile_no,
        'password' => bcrypt($value->password),
        'user_type_id' => $value->user_type_id,
        'designation' => $value->designation,
    ];
    $additionalData = $this->userTypeWiseFieldGenerateForImportInsert($value);

    $insert[$key][] = array_merge($newData, $additionalData);
}

【讨论】:

    【解决方案2】:

    这样的事情可以解决问题:

    function flatten($arr){ 
        $res = []; 
        foreach($arr as $k=>$v){ 
            if(is_array($v)){ 
                $res= array_merge($res, $v); 
            }else{
                $res[$k]=$v;
            }
        }
        return $res;
    };
    
    $arr = ['one','two', 'three', ['four','five']];   
    print_r(test($arr));
    // Output: Array ( [0] => one [1] => two [2] => three [3] => four [4] => five )
    

    希望对你有帮助,

    【讨论】:

    • 已更新,未设置索引
    • 感谢您的回答。我知道这些技巧,但我想知道是否有任何内置于 array_function 的 php 来执行此操作。我不想使用任何循环,因为我有来自导入文件的数据。可能有超过数千条记录
    • @MD.JubairMizan 会有一个 for 循环在某处运行。内置函数只是对其进行抽象,但这就是它们在幕后所做的。为它编写自己的 for 循环没有错。
    • @MD.JubairMizan 内置函数在内部执行相同的迭代,它们执行的不是任何魔法。 PHP 应用程序能够快速迭代数十万条记录,具体取决于整体数据大小。
    • 正如@MD.JubairMizan 所说,根据您的需要,这可以完成工作。某处会发生某种循环。另外,据我所知,没有内置的 php 函数。
    【解决方案3】:

    您也可以在没有 for 循环的情况下解决合并数组。

    你能试试下面的代码吗?

    function reduce(&$item, $key){
        $item = array_merge($item, $item[0]);
        unset($item[0]);
    }       
    
    array_walk($data, 'reduce');
    var_dump($array);
    

    【讨论】:

      【解决方案4】:

      查看array_walk_recursive() 函数。例如:

      $array = /*your array example*/;
      $filter = [];
      foreach ($array as $index => $item) {
        array_walk_recursive($item, function($val, $key) use (&$filter) {
            if (strpos($key, 'territori_code') === 0) {
              $filter[$key] = $val;
            }
        });
      }
      

      注意:决定保留哪些密钥的标准是什么?
      我有一个参考:https://codereview.stackexchange.com/questions/45281/merge-some-child-values-back-into-the-parent-multidimensional-array

      【讨论】:

      • 感谢您的回答。我知道这些技巧,但我想知道是否有任何内置于 array_function 的 php 来执行此操作。我不想使用任何循环,因为我有来自导入文件的数据。可能有超过数千条记录
      【解决方案5】:

      没有 PHP 内置函数可以帮助您轻松实现目标,您必须通过循环或递归函数。

      【讨论】:

        【解决方案6】:

        可以通过使用array_map().创建一个简单的函数来解决

        在下面的代码中,merge_my_array() 函数会将多维数组合并为单个数组,而不管嵌套数组如何包含它。

        $arr = array(
            0 => array(
                    'name' => 'Md. 1111',
                    'email' => 'abc@gmail.com',
                    'mobile_no' => '111111',
                    'password' => '$2y$10$6Vmr61t896IxfJ1A0pxX5Of1hnfUVX9blmdmclAxt56cMd754NkDC',
                    'user_type_id' => 1,
                    'designation' => 'Sr. Software Engineer',
                    0 => array(
                            'market_code' => 'mirpurA203',
                            'product_code' => 'Seclo201',
                            'territori_code' => 'T352',
                            'region_code' => 'Mirpur334',
                            'division_code' => 'Dhaka31',
                      )
                ),
            1 => array(
              'name' => 'Md. 222',
              'email' => 'def@gmail.com',
              'mobile_no' => '222222',
              'password' => '$2y$10$62fwqiAmrv.Jc89i5L3YNuMpcYeFVrpqewuBPKYIgmXiX/9sGRC/S',
              'user_type_id' => 2,
              'designation' => 'Sr. Software Engineer',
              0 => array
                  (
                      'territori_code' =>'T352',
                      'region_code' => 'Mirpur334',
                      'division_code' => 'Dhaka31',
                  )
        
            )
        );
        
        $out = array();
        array_map("merge_my_array",$arr);
        
        echo "<pre> out: "; print_r( $out );echo "</pre>";
        
        
        
        
        function merge_my_array( $elem ){
            global $out;
            if( is_array($elem) ){
                array_map( "merge_my_array", $elem );
            }else{
                array_push($out,$elem);
                return;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-26
          相关资源
          最近更新 更多