2017-08-22 10 views
0

私はループインセプションを行っており、何か助けてください。PHPループが配列を上書きしています

私はいくつかのカールコールをAPIにループし、レコードを取得して別のAPIにプッシュする必要があります。このエンドポイントからの各呼び出しは30レコードしか返さないので、30以上のものがあればループする必要があります。

すべてのループの最後に配列をダンプしようとしています。データは出力されますが、1レコードしか出力されません。

私はここに何か迷っていますか?

$project_ids = array(
    '111111', 
    '222222', 
    ); 

$array = array(); 

foreach ($project_ids as $proj_id) { 

    $go_again = true; 
    $page = 1; 
    $per_page = 30; 

    while ($go_again) { 

     $curl = curl_init($baseurl . $key_url); 

     $keyPOSTdata = array(
      "date_format" => "d-m-Y", 
      "page" => $page, 
      "projects_id" => $proj_id, 
     ); 

     curl_setopt($curl, CURLOPT_POST, false); 
     curl_setopt($curl, CURLOPT_HEADER, false); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($keyPOSTdata)); 
     curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

     $response = curl_exec($curl); 

     $result = json_decode($response); 
     $total = $result->body->total_count; 
     $new_total = $total - ($per_page * $page); 

     if($total - ($per_page * $page) > 0) { 
      ++$page; 
     } 
     else { 
      $page = 1; 
      $go_again = false; 
     } 

     curl_close($curl); 

     foreach ($result->body as $item) { 
      $array['attribute1'] = $item->attribute1; 
      $array['attribute2'] = $item->attribute2; 
      $array['attribute3'] = $item->attribute3; 
     } 

    } 

} 

echo '<pre>'; 
print_r($array); 
echo '</pre>'; 
exit(); 

答えて

3

実際には、ループごとに配列を書き換えています。各レコードに対して新しい行を初期化しないことに注意してください。あなたは「attributeX」フィールドに何度も繰り返し書き込んでいます。これは動作するはずです:

foreach ($result->body as $item) { 
    $record = []; 
    $record['attribute1'] = $item->attribute1; 
    $record['attribute2'] = $item->attribute2; 
    $record['attribute3'] = $item->attribute3; 
    $array[] = $record; 
} 
+0

ああ、書き直しがなぜ起こっていたのかわかりました。しかし、このメソッドに変更すると、出力に変化はありません。まだ1つのアイテムしかダンプされていません... – thatryan

+0

私はあなたが応答の各要素を1つの要素の本体に渡って繰り返すわけではないと思います。 whileループの中に2つの 'foreach'が必要になるでしょう。あなたの質問にサンプルの回答を編集していただけますか? – ishegg

+1

私は、新しい$レコードのtemp配列と$ array []割り当てをforeachループの内側に移動することで、動作しています。 – thatryan

0

を使用すると、プロジェクトIDごとに、あなたのアイテムが必要な場合、あなたはおそらくしたい:

foreach ($result->body as $i => $item) { 
    $record[$proj_id][$i]['attribute1'] = $item->attribute1; 
    $record[$proj_id][$i]['attribute2'] = $item->attribute2; 
    $record[$proj_id][$i]['attribute3'] = $item->attribute3; 
} 
+0

エンド配列が他のAPIにプッシュする必要がある形式なので、これが機能するかどうかわからないので、多次元にすることはできません – thatryan

0

あなたがここに上書きされます!

$array['attribute1'] = $item->attribute1; 
$array['attribute2'] = $item->attribute2; 
$array['attribute3'] = $item->attribute3; 

すべてのループがこれらの値を上書きします。

あなたはそれはあなたが配列をしたいか、あなたの条件に依存して二つの方法、

foreach ($result->body as $key => $item) { 
    $record[$key]['attribute1'] = $item->attribute1; 
    $record[$key]['attribute2'] = $item->attribute2; 
    $record[$key]['attribute3'] = $item->attribute3; 
} 

OR

foreach ($result->body as $key => $item) { 
    $record['attribute1'][] = $item->attribute1; 
    $record['attribute2'][] = $item->attribute2; 
    $record['attribute3'][] = $item->attribute3; 
} 

でこれを解決することができます。

関連する問題