2017-01-13 6 views
2

私は3つのデータベースクエリを持っています(クエリ結果の概要は以下を参照してください)。3つの配列の要素を同じIDでマージできますか?

は、この3つの配列の要素(DB内に200.000以上の製品を含む)を、以下の例のように重複する配列キーと値なしでマージできますか?

所望の結果:私は配列機能array_mergeを使用することを試みた

Array 
(
    [0] => Array 
     (
      [id] => 42710 
      [imageName] => somthing 
      [image] => https://www.somthing.com/image.jpg 
      [loyality] => 122     
      [p_num] => 8 
      [cpc] => 2 
     ) 

    [...]  
) 

array_merge_recursivearray_replacearray_replace_recursivearray_unique。しかし、私はすべての配列を明確にマージできませんでした。クエリ1の


結果(> 200000合計):クエリ3(1820合計)の

Array 
(
    [0] => Array 
     (
      [id] => 42710 
      [loyality] => 122 
     ) 

    [...] 

) 

結果:クエリ2(1450合計)の

Array 
(
    [0] => Array 
     (
      [id] => 42710 
      [imageName] => somthing 
      [image] => https://www.somthing.com/image.jpg 
     ) 

    [...] 
) 

結果

Array 
(
    [0] => Array 
     (
      [id] => 42710 
      [p_num] => 8 
      [cpc] => 2 
     ) 

    [...] 

) 

注:提案をしないでください"SQL JOIN句"にsedを送ります。

私は、PHP5.6、Symfony2、Doctrine2、およびMySQL 5.5.52を使用しています。

+0

5月これは既にこのポストで尋ねられるかもしれませんか? [http://stackoverflow.com/questions/13469803/php-merging-two-array-into-one-array-also-remove-duplicates](http://stackoverflow.com/questions/13469803/php-merging 2つの配列を1つの配列にも削除する) –

+0

データベースから200k行を取り出して、99%をフィルタリングしていますか? – shudder

+0

'[id]'は配列ごとに全く同じことを表していますか?私は年齢の異なる2つの配列を持つが、異なる値を持つと言及しているので、私は疑問に思っている? –

答えて

0

私は大規模な配列のためのよりよい解決策を見つけることができます。

最初のカスタムリポジトリを介してデータをフェッチ:すべて一緒

$findNumberOfClicks = array_search($this->arrayKey['id'], array_column($this->numberOfClicks, 'id')); 
$findOnlineDate  = array_search($this->arrayKey['id'], array_column($this->productOnlineDate, 'id')); 

第三に、マージ配列:

$this->productAttributes = $this->manager->getRepository('ProductBundle:Rating')->findAllAttributeOfProducts(); 
$this->productOnlineDate = $this->manager->getRepository('ProductBundle:Rating')->findOnlineDate(); 
$this->numberOfClicks = $this->manager->getRepository('ProductBundle:Rating')->findNumberOfClicks(); 

$this->arrayMergedResult = []; 

      foreach ($this->productAttributes as $this->product => $this->arrayKey) { 

       // find product ID in all arrays 
       $findNumberOfClicks = array_search($this->arrayKey['id'], array_column($this->numberOfClicks, 'id')); 
       $findOnlineDate  = array_search($this->arrayKey['id'], array_column($this->productOnlineDate, 'id')); 

       // merge arrays 
       switch (true) { 
        case ($findOnlineDate === false && $findNumberOfClicks === false): 
         $this->arrayMergedResult = $this->arrayKey; 
         break; 
        case ($findOnlineDate === false): 
         $this->arrayMergedResult = $this->arrayKey + $this->numberOfClicks[$findNumberOfClicks]; 
         break; 
        case ($findNumberOfClicks === false): 
         $this->arrayMergedResult = $this->arrayKey + $this->productOnlineDate[$findOnlineDate]; 
         break; 
        default: 
         $this->arrayMergedResult = $this->arrayKey + $this->numberOfClicks[$findNumberOfClicks] + $this->productOnlineDate[$findOnlineDate]; 
       } 

      } 

$this->productAttributes = $this->manager->getRepository('ProductBundle:Rating')->findAllAttributeOfProducts(); 
$this->productOnlineDate = $this->manager->getRepository('ProductBundle:Rating')->findOnlineDate(); 
$this->numberOfClicks = $this->manager->getRepository('ProductBundle:Rating')->findNumberOfClicks(); 

第二array_searcharray_columnによって、すべての配列でのproductIDを見つけます

0

このように各配列を走査し、結果配列$oに要素を保存します。

$o = []; 
array_walk($array1, function($v) use (&$o) { 
    foreach($v as $key => $value) { 
     $o[$v['id']][$key] = $value; 
    } 
}); 
1

あなたは物事は、次の例を見てみ明確にするために、結果をマージするarray_merge機能を使用することができます。

<?php 

$resultSet1=[['id' => '32','name' => 'john'], ['id' => '15','name' => 'amin']]; 
$resultSet2=[['id' => '32','lastname' => 'doe'],['id' => '15','lastname' => 'alizade']]; 
$resultSet3=[['id' => '32','age' => '28'], ['id' => '15','age' => '25']]; 

$resultSet = array_merge($resultSet1, $resultSet2, $resultSet3); 

$result = []; 
foreach ($resultSet as $record) { 
    $key = $record['id']; 
    if (array_key_exists($key, $result)) { 
     $result[$key] = array_merge($result[$key], $record); 
    }else{ 
     $result[$key] = $record; 
    } 
} 

var_dump($result); 
+0

残念ながらそれは間違っています。 'id'とageの値が異なる配列を1つ追加し、結果を確認します。 –

+0

が必要なものに正確に合わせて更新されました。 –

関連する問題