1

このarray_mergeは私にはうまくいかないようです。私は次のようにすべての配列を1つの配列にマージしようとしています:

foreach ($collection as $result) {
          $i++;
          if(empty($json)){
            $json = $result->getData();                                
          }else{
            $json = array_merge($json, $result->getData());                
          }
      }
      print_r($json);

コレクションに3つの配列があります。しかし、print_r($ json);を実行すると このような最後の配列のみが表示されます。

Array ( 
    [po_id]           => 3 
    [title]           => Test3 
    [geo_address]     => M1 2FF 
    [latitude]        => 53.449137 
    [longitude]       => -2.364551 
    [display_address] => testing 
    [url]             => http://testing.com 
    [phone]           => 0321654987 
    [status]          => 1 
    [type]            => 1 
    [created_time]    => 2012-01-26 11:07:05 
    [update_time]     => 2012-01-26 11:10:13 
    [distance]        => 3708.40724665926 
)

これにより、3つの配列すべてがマージされ、出力されることを期待しています。

私はちょっとそれをこのように期待しています:

Array ( 
[po_id]           => 1 
[title]           => Test1 
[geo_address]     => M1 2FF
[po_id]           => 2 
[title]           => Test2 
[geo_address]     => M2 2FF  
[po_id]           => 3 
[title]           => Test3 
[geo_address]     => M3 2FF 

)。

すべてのアレイをアレイにマージする必要があることを意味します。

編集済み

私はそれを機能させています。実際、これは私が探していたものです:

$json = array();

    foreach ($collection as $key=>$result) {

         $data = $result->getData();

         $json[$key]['postorefinder_id'] = $data['postorefinder_id'];
         $json[$key]['title'] = $data['title'];
         $json[$key]['geo_address'] = $data['geo_address'];
         $json[$key]['latitude'] = $data['latitude'];
         $json[$key]['latitude'] = $data['latitude'];
         $json[$key]['longitude'] = $data['longitude'];
         $json[$key]['display_address'] = $data['display_address'];
         $json[$key]['url'] = $data['url'];
         $json[$key]['phone'] = $data['phone'];
         $json[$key]['status'] = $data['status'];
         $json[$key]['type'] = $data['type'];
         $json[$key]['created_time'] = $data['created_time'];
         $json[$key]['update_time'] = $data['update_time'];
         $json[$key]['distance'] = $data['distance'];
    }
    return json_encode($json);

@cillosisに感謝します、あなたの例は本当に役に立ちました。

4

2 に答える 2

4

php.netのarray_merge()関数によると:

入力配列に同じ文字列キーがある場合、そのキーの新しい値が前の値を上書きします。ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きしませんが、追加されます。

つまり、それらをマージしようとするたびに、同じキーを使用しているため、上書きされるだけです。そのため、最後の配列しか表示されません。

[編集]

では、1つの配列で同じキーを持つ複数の配列を連結するにはどうすればよいでしょうか。

そのキーに次のような別の配列が含まれていない限り、2つの要素が同じキーを共有する方法がわかりません。

foreach ($collection as $result) {

   // Get collection of data
   $data = $result->getData();

   // Assign each result to multi-dimensional array
   $json['po_id'][] = $data['po_id'];
   $json['title'][] = $data['title'];
   $json['geo_address'][] = $data['geo_address'];
   $json['latitude'][] = $data['latitude'];
   // ... the rest of them go here ...

}

それはテストされていません、ただそれを本当に素早く一緒に投げました。次のように出力されます。

Array(
   "po_id": Array(
      "first_po_id",
      "second_po_id",
      "third_po_id" 
   ),
   "title": Array(
      "first_title",
      "second_title",
      "third_title" 
   )
)

もちろんそれよりも多くのデータがあります。

于 2012-02-01T18:36:21.007 に答える
1

残念ながら、あなたが望んでいる構造はPHPでは不可能です。配列型について読んでください; 既存のキーに値を割り当てようとすると、既存の値が上書きされます。

$array = array('foo' => 'bar');
$array = array_merge($array, array('foo' => 'new'));
var_dump($array['foo']); // new

結果のデータをどのように操作するかに応じて、array_merge_recursiveを使用できます。

$json = array();

foreach ($collection as $result) {
    $json = array_merge_recursive($json, $result->getData());
}

または、コレクションを結果ごとにグループ化することもできます。

// make $json a copy of $collection
$json = $collection;

// overwrite $result within $json 
foreach ($json as &$result) {
    $result = $result->getData(); 
}

編集これらの各アプローチの出力例を参照してください。

于 2012-02-02T00:54:06.563 に答える