Reputation: 2893
I am having an issue populating my array. I have a csv file which has 1 column containing some ids. I load and process the csv and end up with an array like so
array:5 [▼
0 => array:2 [▼
0 => "ID123"
]
1 => array:2 [▼
0 => "ID234"
]
2 => array:2 [▼
0 => "ID345"
]
3 => array:2 [▼
0 => "ID456"
]
4 => array:2 [▼
0 => "ID567"
]
]
Using these ids I hit an API on an id to get data specific to that id. So I loop the array containing the ids and do something like the following
$jobData = array();
foreach($csv as $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.somdomain/some.api/get/".$data[0].");
//other curl stuff
$output = curl_exec($ch);
$output = new \SimpleXMLElement($output);
}
Now if I output the result of output, I get something like this
SimpleXMLElement {#352 ▼
+"Job": SimpleXMLElement {#383 ▼
+"ID": "ID123"
+"Client": SimpleXMLElement {#387 ▼
+"ID": "12345"
}
+"Assigned": SimpleXMLElement {#392 ▼
+"Staff": array:5 [▼
0 => SimpleXMLElement {#403 ▼
+"ID": "12345"
}
1 => SimpleXMLElement {#404 ▼
+"ID": "23456"
}
2 => SimpleXMLElement {#405 ▼
+"ID": "34567"
}
]
}
}
}
So I need to build up an array containing the data for all the IDs that I have. So within the foreach loop above I am doing something like this
foreach($csv as $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.somdomain/some.api/get/".$data[0].");
//other curl stuff
$output = curl_exec($ch);
$output = new \SimpleXMLElement($output);
if (!empty($output)) {
$jData['jobInfo'] = array(
'clientId' => (string)$output->Job->Client->ID,
'startDate' => '20160701',
'dueDate' => '20160731'
);
if(!empty($output->Job->Assigned->Staff)) {
foreach ($output->Job->Assigned->Staff as $staff) {
$jData['staffInfo'][] = array(
'staffId' => (string)$staff->ID
);
}
}
}
$jobData[] = $jData;
}
Now this works to a point. I added an extra [] onyo the staffInfo element because there can be more than 1 staff member as the output above demonstrates. The problem I am having with the above is that it seems to duplicate some things. So the output of jobData array is as follows
array:5 [▼
0 => array:4 [▼
"jobInfo" => array:4 [▶]
"staffInfo" => array:5 [▶]
]
1 => array:4 [▼
"jobInfo" => array:4 [▶]
"staffInfo" => array:6 [▶]
]
2 => array:4 [▼
"jobInfo" => array:4 [▶]
"staffInfo" => array:7 [▶]
]
3 => array:4 [▼
"jobInfo" => array:4 [▶]
"staffInfo" => array:8 [▶]
]
4 => array:4 [▼
"jobInfo" => array:4 [▶]
"staffInfo" => array:15 [▶]
]
]
As you can see, element 0 has an array of size 5 for staffInfo. Element 1 increases to 6, element 2 is 7, element 3 is 8 and element 4 is 15. If I manually check the system the API is calling, element 0 should have 5 which is correct. Element 1 should have 1, element 2 should have 1, element 3 should have 1 and element 4 should have 7.
So how do I stop this from adding the previous loops result onto the next result?
Thanks
Upvotes: 0
Views: 51
Reputation: 14618
You don't initialize $jData
anywhere. This is a bad practice. As a result, it is always the same. You keep overriding the jobInfo
, and keep adding to staffInfo
.
You need to initialize the array at the beginning of every iteration.
Upvotes: 1