我有一组mysqli结果,我正在迭代创建嵌套数组,每个嵌套数组中都有相同的顺序ID。
Here is what each record looks like when using <pre>print_r($result)</pre>
mysqli选择:
SELECT s.*, s.id as stopId, o.* FROM stops AS s INNER JOIN orders AS o ON o.id = s.orderId WHERE o.status = 'A' AND scheduledArrivalEarly >= CURDATE() ORDER BY scheduledArrivalEarly ASC, state ASC
这是mysqli结果对象:
mysqli_result Object
(
[current_field] => 0
[field_count] => 83
[lengths] =>
[num_rows] => 478
[type] => 0
)
我知道我有多个结果,而我遇到的问题是当我遍历结果对象并开始构造数组时,它只经过1次迭代并停止。
Here is the array structure I expect when using my code to build the nested arrays。
我得到了第一个带有该结构的结果,但正如我之前所说,迭代在第一个结果之后停止。
以下是我用来构建嵌套数组的代码:
$ress = $results;
$count = 0;
foreach($results as $result){
echo $count . "<br>";
$orderId = $result['orderId'];
$records[$count] = array();
foreach($ress as $r){
if($r['orderId'] == $orderId and !in_array($r, $records[$count])){
array_push($records[$count], $r);
}
}
$count += 1;
}
有人知道为什么这会在第一次迭代后停止吗?
答案 0 :(得分:2)
因为结果集不是数组(虽然它是可迭代的),但它是一个资源。但是,当您到达结果集的末尾时,需要手动将其重置为开头,然后再次迭代它
在第一次检索到$result
之后,您将遍历整个$ress
(少于第一条记录),因此您需要重置结果集指针才能进入下一个$result
,因为$ ress和$ results都指向同一个资源。
使用data_seek在$count
$count += 1;
$ress = $results;
$count = 0;
foreach($results as $result){
echo $count . "<br>";
$orderId = $result['orderId'];
$records[$count] = array();
foreach($ress as $r){
if($r['orderId'] == $orderId and !in_array($r, $records[$count])){
array_push($records[$count], $r);
}
}
$count += 1;
$results->data_seek($count);
}