【问题标题】:Using foreach in a while loop在while循环中使用foreach
【发布时间】:2015-09-23 11:10:35
【问题描述】:

问题:我在 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循环中,效果很好! 谢谢您的帮助!

【问题讨论】:

  • $time='20:00'; 立即查看
  • 对于调试,您可以在您的forvar_dump($n)。这将有助于了解正在发生的事情。

标签: php loops foreach while-loop


【解决方案1】:

请按以下方式操作:-

$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);检查它的结构

【讨论】:

  • 是的,这帮助我解决了我的问题!
  • Yay this helped me partway down my problem! ?什么意思?
【解决方案2】:

试试这个:

$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

}

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 2013-10-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2015-07-03
    • 2012-01-12
    相关资源
    最近更新 更多