簡體   English   中英

從多維數組合並數組

[英]Array Merge from multidimensional Array

我想將多維數組合並為單個數組。 我想知道是否有任何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
    )
)

像這樣的事情可以解決問題:

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 )

希望這可以幫助,

要修復您的原始導入...

您的子函數( 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);
}

查看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

沒有 PHP 內置函數可以幫助您輕松實現目標,您必須通過循環或遞歸函數。

它可以通過使用array_map().創建一個簡單的函數來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;
    }
}

您也可以在沒有 for 循環的情況下解決合並數組。

您可以嘗試以下代碼嗎?

function reduce(&$item, $key){
    $item = array_merge($item, $item[0]);
    unset($item[0]);
}       

array_walk($data, 'reduce');
var_dump($array);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM