2016-08-22 17 views
1

をマージ私はこのような多次元配列を出力し、クエリを実行しています: -PHP多次元配列は問題

Array 
(
[0] => Array 
    (
     [0] => Array 
      (
       [id] => 772 
       [display_name] => Test Company Ltd 
       [profile_page] => partners/test-company 
      ) 

    ) 

[1] => Array 
    (
    ) 

[2] => Array 
    (
     [0] => Array 
      (
       [id] => 772 
       [display_name] => Test Company Ltd 
       [profile_page] => partners/test-company 

      ) 

) 

私たちは、当社のサイト上で、それをループできるように、アレイは、このように見えるようにしようとしています: -

Array 
(
[0] => Array 
    (
     [id] => 772 
     [display_name] => Test Company Ltd 
     [profile_page] => partners/test-company 
    ) 
) 

これは、すべてSymfony2とDoctrine2を使用してPHPを使用して生成されています。私はこの作業を取得する方法をいくつか試してみましたが、私は戻ってこれです私の第一の方法に戻ってきた: - 誰かがどのようにこの問題を回避するために私を示すことができるならば、それは素晴らしいことだ

$companies = array(); 

foreach($postcodes as $key=>$value) { 
    $conn = $em->getConnection(); 

    $query = $conn->prepare("SELECT a.id, a.display_name, a.profile_page, b.meta_data FROM companies a, `cms`.pages b WHERE b.slug = a.profile_page AND a.active = 1 AND a.postcode = ".$value." ORDER BY a.display_name ASC"); 
    $execute = $query->execute(); 
    $companies[] = array_replace_recursive($query->fetchAll()); 
} 

echo '<pre>'; print_r($companies); echo '</pre>'; 

die(); 

答えて

2

$query->fetchAll()は、それが必要とする多次元配列です。

ちょうどあなたが別の配列に多次元配列を押していたので、それが働いていなかった

$innCompnies=$query->fetchAll(); 
foreach($innCompnies as $inComp) { 
    $companies[]=$inComp; 
} 

で次の行

$companies[] = array_replace_recursive($query->fetchAll()); 

を交換してください。実際に行う必要があるのは、要素を1つずつメイン配列にプッシュすることです。

+0

私はこれを試しましたが、$企業やarray_replace_recursiveから角括弧を削除すると空の配列が表示されました。角括弧を入れてarray_replace_recursiveを削除すると、まったく同じ答えになります。 –

+0

こんにちはAlok、それはすばらしい、それは治療を働いた。ありがとうございました。しかし、2つの値が似ているので、どのようにマージしますか? –

+1

'foreach'で訪問したIDを追跡する必要があります。idが以前に訪れなかった場合は、配列を挿入するだけです。 –

0

ループ内でSQLクエリを避けることをお勧めします。また、ポストコードをクエリに連結する潜在的なSQLインジェクションの脆弱性もあります。したがって、可能な解決策はforeachループを次のようなものに置き換える可能性があります。

$companies = $conn->fetchAll(
    "SELECT a.id, a.display_name, a.profile_page, b.meta_data FROM companies a, `cms`.pages b WHERE b.slug = a.profile_page AND a.active = 1 AND a.postcode IN :postcodes ORDER BY a.display_name ASC", 
    compact('postcodes') 
); 
0

このような多次元配列を変換できます。

$new_companies = array(); 
array_walk($companies, function($companie) use($companies, &$new_companies){ 
    if(is_array($companie)) { 
    foreach ($companie as $c) { 
     $new_companies[] = $c; 
    } 
    } 
}); 

$ new_companiesが必要です。