在 while 循环中使用 foreach
Using foreach in a while loop
问题:我在 while 循环中有一个 foreach 循环。对于从数据库中选择的每一行,foreach 循环都必须完成。但是当我回显 $row 时,它似乎立即输出了所有行,然后仅通过一次 foreach。我已经通读了手册,但不幸的是它对我没有帮助。
代码:
$conn = oci_connect('login', 'pass', '127.0.0.1/xe');
$stid = oci_parse($conn, 'select TOKEN, SECRET from TOKENS');
oci_execute($stid);
$time=20:00
while(($row = oci_fetch_row($stid)) != false) {
$fitbit->setOAuthDetails($row[0], $row[1]);
//retreive steps. (with date and time)
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
$n=0;
foreach ($steps as $value){
$sqlArray[$n]['dateTime']=$value->dateTime;
$sqlArray[$n]['time'] = $time;
$sqlArray[$n]['steps'] = $value->value;
$n++;
}
}
可能是我忽略了一些东西,但我希望我的问题能得到解答。
更新代码:
$time="12:00";
$n=0;
$x=0;
while(($row = oci_fetch_row($stid)) != false) {
$sqlArray[$n]['token'] = $row[0];
$sqlArray[$n]['secret'] = $row[1];
echo 'hoi';
$fitbit->setOAuthDetails($sqlArray[$n]['token'], $sqlArray[$n]['secret']);
//retreive steps. (with date and time)
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
foreach ($steps as $value){
$sqlArray[$n][$x]['dateTime']=$value->dateTime;
$sqlArray[$n][$x]['time'] = $time;
$sqlArray[$n][$x]['steps'] = $value->value;
$x++;
}
//retreive calories and add to sqlArray where date matches. (used for testing now, when acces to intraday api the outcommented code below will be used.
$calories = $fitbit->getTimeSeries('caloriesOut', '2015-06-01', '2015-07-01');
$x=0;
foreach ($calories as $value){
$checkdate=$value->dateTime;
if ($sqlArray[$n][$x]['dateTime'] == $checkdate){
$sqlArray[$n][$x]['calories'] = $value->value;
}
$x++;
}
$n++;
};
现在我的输出如下:
Array
(
[0] => Array
(
[token] => token
[secret] => secret
[0] => Array
(
[dateTime] => 2015-06-01
[time] => 12:00
[steps] => 8046
[calories] => 2785
)
它很好地迭代了数据库中的标记。但是,在第一次迭代之后,卡路里下降了:
[1] => Array
(
[token] => token
[secret] => secret
[31] => Array
(
[dateTime] => 2015-06-01
[time] => 12:00
[steps] => 8046
)
我想我又做错了......我认为这与 $x 变量有关,但我不确定。
没错,就是我!我放置了 $x=0;现在在 while 循环中,效果很好!
谢谢您的帮助!
试试这个:
$n=0; // Initiate $n
while(($row = oci_fetch_row($stid)) != false) {
$fitbit->setOAuthDetails($row[0], $row[1]);
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
// Dont initiate $n here
foreach ($steps as $value){
$sqlArray[$n]['dateTime']=$value->dateTime;
$sqlArray[$n]['time'] = $time;
$sqlArray[$n]['steps'] = $value->value;
// Dont increment $n here
}
$n++; // Increment $n 'outside' your foreach
}
请按以下方式操作:-
$conn = oci_connect('login', 'pass', '127.0.0.1/xe');
$stid = oci_parse($conn, 'select TOKEN, SECRET from TOKENS');
oci_execute($stid);
$time='20:00';
$new_array = array(); // create a new array
$i = 0;
while(($row = oci_fetch_row($stid)) != false) {
$new_array[$i][] = $row[0]; // assign values to that new array
$new_array[$i][] = $row[1]; // assign values to that new array
$i++;
}
$sqlArray = array(); // create another new array
$n=0;
foreach($new_array as $array){
$fitbit->setOAuthDetails($array[0], $array[1]); // iterate on first array values
//retreive steps. (with date and time)
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
$sqlArray[$n]['dateTime']=$value->dateTime; // assign value to new array
$sqlArray[$n]['time'] = $time; // assign value to new array
$sqlArray[$n]['steps'] = $value->value; // assign value to new array
$n++;
}
现在你想在多维数组 $sqlArray
上做什么,你可以通过 echo "<pre/>";print_r($sqlArray);
检查它的结构
问题:我在 while 循环中有一个 foreach 循环。对于从数据库中选择的每一行,foreach 循环都必须完成。但是当我回显 $row 时,它似乎立即输出了所有行,然后仅通过一次 foreach。我已经通读了手册,但不幸的是它对我没有帮助。
代码:
$conn = oci_connect('login', 'pass', '127.0.0.1/xe');
$stid = oci_parse($conn, 'select TOKEN, SECRET from TOKENS');
oci_execute($stid);
$time=20:00
while(($row = oci_fetch_row($stid)) != false) {
$fitbit->setOAuthDetails($row[0], $row[1]);
//retreive steps. (with date and time)
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
$n=0;
foreach ($steps as $value){
$sqlArray[$n]['dateTime']=$value->dateTime;
$sqlArray[$n]['time'] = $time;
$sqlArray[$n]['steps'] = $value->value;
$n++;
}
}
可能是我忽略了一些东西,但我希望我的问题能得到解答。
更新代码:
$time="12:00";
$n=0;
$x=0;
while(($row = oci_fetch_row($stid)) != false) {
$sqlArray[$n]['token'] = $row[0];
$sqlArray[$n]['secret'] = $row[1];
echo 'hoi';
$fitbit->setOAuthDetails($sqlArray[$n]['token'], $sqlArray[$n]['secret']);
//retreive steps. (with date and time)
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
foreach ($steps as $value){
$sqlArray[$n][$x]['dateTime']=$value->dateTime;
$sqlArray[$n][$x]['time'] = $time;
$sqlArray[$n][$x]['steps'] = $value->value;
$x++;
}
//retreive calories and add to sqlArray where date matches. (used for testing now, when acces to intraday api the outcommented code below will be used.
$calories = $fitbit->getTimeSeries('caloriesOut', '2015-06-01', '2015-07-01');
$x=0;
foreach ($calories as $value){
$checkdate=$value->dateTime;
if ($sqlArray[$n][$x]['dateTime'] == $checkdate){
$sqlArray[$n][$x]['calories'] = $value->value;
}
$x++;
}
$n++;
};
现在我的输出如下:
Array
(
[0] => Array
(
[token] => token
[secret] => secret
[0] => Array
(
[dateTime] => 2015-06-01
[time] => 12:00
[steps] => 8046
[calories] => 2785
)
它很好地迭代了数据库中的标记。但是,在第一次迭代之后,卡路里下降了:
[1] => Array
(
[token] => token
[secret] => secret
[31] => Array
(
[dateTime] => 2015-06-01
[time] => 12:00
[steps] => 8046
)
我想我又做错了......我认为这与 $x 变量有关,但我不确定。
没错,就是我!我放置了 $x=0;现在在 while 循环中,效果很好! 谢谢您的帮助!
试试这个:
$n=0; // Initiate $n
while(($row = oci_fetch_row($stid)) != false) {
$fitbit->setOAuthDetails($row[0], $row[1]);
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
// Dont initiate $n here
foreach ($steps as $value){
$sqlArray[$n]['dateTime']=$value->dateTime;
$sqlArray[$n]['time'] = $time;
$sqlArray[$n]['steps'] = $value->value;
// Dont increment $n here
}
$n++; // Increment $n 'outside' your foreach
}
请按以下方式操作:-
$conn = oci_connect('login', 'pass', '127.0.0.1/xe');
$stid = oci_parse($conn, 'select TOKEN, SECRET from TOKENS');
oci_execute($stid);
$time='20:00';
$new_array = array(); // create a new array
$i = 0;
while(($row = oci_fetch_row($stid)) != false) {
$new_array[$i][] = $row[0]; // assign values to that new array
$new_array[$i][] = $row[1]; // assign values to that new array
$i++;
}
$sqlArray = array(); // create another new array
$n=0;
foreach($new_array as $array){
$fitbit->setOAuthDetails($array[0], $array[1]); // iterate on first array values
//retreive steps. (with date and time)
$steps = $fitbit->getTimeSeries('steps', '2015-06-01', '2015-07-01');
$sqlArray[$n]['dateTime']=$value->dateTime; // assign value to new array
$sqlArray[$n]['time'] = $time; // assign value to new array
$sqlArray[$n]['steps'] = $value->value; // assign value to new array
$n++;
}
现在你想在多维数组 $sqlArray
上做什么,你可以通过 echo "<pre/>";print_r($sqlArray);