2016-12-28 14 views
3

私はPHP 5.6を使用しています。私はこのような配列があります。同じキーを持つ配列内の配列を動的にマージする

$array = [ 
    0 => [ 
     '[email protected]' => [ 
      'email' => '[email protected]', 
      'firstname' => 'john', 
      'lastname' => 'drake', 
      'food' => 'burger', 
     ], 
    ], 
    1 => [ 
     '[email protected]' => [ 
      'email' => '[email protected]', 
      'firstname' => 'john', 
      'lastname' => 'drake', 
      'drink' => 'coke', 
     ], 
    ], 
    2 => [ 
     '[email protected]' => [ 
      'email' => '[email protected]', 
      'firstname' => 'sam', 
      'lastname' => 'win', 
      'food' => 'pizza', 
     ], 
    ], 
    3 => [ 
     '[email protected]' => [ 
      'email' => '[email protected]', 
      'firstname' => 'sam', 
      'lastname' => 'win', 
      'drink' => 'pepsi', 
     ], 
    ], 
]; 

をさんは「食」とはカテゴリであり、彼らはアンケートが設定した方法に応じて異なることがあり、「飲む」としましょう。だから実際には "食べ物"、 "飲み物"、 "デザート"などがあります。ご覧のように、それぞれのカテゴリーごとに、それぞれの人物の配列があります。私は何をしたいのではなく、以下に表示されますように、一人一人によって配列をマージすることです:

$array = [ 
    0 => [ 
     '[email protected]' => [ 
      'email' => '[email protected]', 
      'firstname' => 'john', 
      'lastname' => 'drake', 
      'food' => 'burger', 
      'drink' => 'coke', // Merged 
     ], 
    ], 
    1 => [ 
     '[email protected]' => [ 
      'email' => '[email protected]', 
      'firstname' => 'sam', 
      'lastname' => 'win', 
      'food' => 'pizza', 
      'drink' => 'pepsi', // Merged 
     ], 
    ], 
]; 

私はしかし、私が読んだすべてのものから、array_mergeなどarray_merge_recursiveを見てきましたそれらをマージするために配列を指定する必要があります。例えば、配列はarray_merge(array[0], array[1])でなければなりません。ご覧のように、私は正確にこれを行うことはできません。なぜなら、一緒にマージする必要がある1人あたり2,3または4つの配列が存在する可能性があるからです。

どのように私は動的にそれらのすべての情報を一緒に表示するように各人のための配列をマージするのですか?

+0

はループ内を単にトラバースして結果を生成します – Mojtaba

答えて

0

これはまさに、結果として、あなたが尋ねた、それはかなり厄介に感じるが、それはあなたが:)

$result = []; 

foreach ($array as $answers) { 
    foreach ($answers as $email => $values) { 
     if (!isset($result[$email])) { 
      $result[$email] = $values; 
      continue; 
     } 
     $result[$email] = array_merge($result[$email], $values); 
    } 
} 

し、結果をさらに働くことができるものであるかもしれないではありません。

$result === [ 
    '[email protected]' => [ 
     'email' => '[email protected]', 
     'firstname' => 'john', 
     'lastname' => 'drake', 
     'food' => 'burger', 
     'drink' => 'coke', 
    ], 
    '[email protected]' => [ 
     'email' => '[email protected]', 
     'firstname' => 'sam', 
     'lastname' => 'win', 
     'food' => 'pizza', 
     'drink' => 'pepsi', 
    ], 
] 
+0

これは彼が望む結果ではありません – Mojtaba

+0

ありがとう@martindilling。あなたの答えは私に必要な結果を与えました。私の質問の私の提案された結果が誰を混乱させなかったことを願っています。 – Dillon

+0

@Mojtaba、私はそれが正確に彼が要求したものではないことを知っている、と私はそれを述べて私の答えを始めた:)しかし、結果が一緒に電子メールが一意であるように合併されたとき、私は本当にラッピングの余分な層の理由を参照することはできません:) – martindilling

0
<?php 
$originalArray=array (
     0 => array ('[email protected]' => array ('email' => '[email protected]', 'firstname' => 'john', 'lastname' => 'drake', 'food' => 'burger')), 
     1 => array ('[email protected]' => array ('email' => '[email protected]', 'firstname' => 'john', 'lastname' => 'drake', 'drink' => 'coke')), 
     2 => array ('[email protected]' => array ('email' => '[email protected]', 'firstname' => 'sam', 'lastname' => 'win', 'food' => 'pizza')), 
     3 => array ('[email protected]' => array ('email' => '[email protected]', 'firstname' => 'sam' ,'lastname' => 'win', 'drink' => 'pepsi')) 
); 
$tempArray=array(); 
$newArray=array(); 
foreach($originalArray as $key=>$val){ 
    $valKey=key($val); 
    if(isset($tempArray[$valKey])){ 
     $newArray[]=array_merge($tempArray[$valKey],$val[$valKey]); 
    } 
    else{ 
     $tempArray[$valKey]=$val[$valKey]; 
    } 
} 
echo "<pre>";print_r($newArray); 
関連する問題