while-loop,undefined offset

时间:2015-05-12 11:19:38

标签: php arrays while-loop

我从索引20开始得到“Undefined offset”错误,如下面的输出所示:

<b>Notice</b>:  Undefined offset: 20 in <b>/var/www/sso/html/wp-content/plugins/auto-login/papex-auto-login.php</b> on line <b>214</b><br />
<br />
<b>Notice</b>:  Undefined offset: 21 in <b>/var/www/sso/html/wp-content/plugins/auto-login/papex-auto-login.php</b> on line <b>214</b><br />
<br />
<b>Notice</b>:  Undefined offset: 22 in <b>/var/www/sso/html/wp-content/plugins/auto-login/papex-auto-login.php</b> on line <b>214</b><br />
<br />

我的数组$match - 下面 - 有20个索引。我的SQL问题的输出是正确的 - 我已多次检查它。对于print_r,foreach循环的输出为echo $value->meta_key

似乎while循环遍历整个$match数组,但不会终止。这就是为什么我认为它从20开始产生“未定义”偏移量。

我做错了什么;怎么来 - 如果它的权利 - 代码不会退出while循环?

// Get user id      
$db_user_id = $wpdb->get_row("SELECT ID FROM $table_users WHERE user_email = '$user_email'");

// Get user result
$results = $wpdb->get_results("SELECT * FROM $table_usermeta WHERE user_id = '$db_user_id->ID'");

$match = array(
            "billing_country",
            "billing_first_name",
            "billing_last_name",
            "billing_company",
            "billing_address_1",
            "billing_address_2",
            "billing_city",
            "billing_state",
            "billing_postcode",
            "billing_email",
            "billing_phone",
            "shipping_country",
            "shipping_first_name",
            "shipping_last_name",
            "shipping_company",
            "shipping_address_1",
            "shipping_address_2",
            "shipping_city",
            "shipping_state",
            "shipping_postcode"
);



foreach($results as $value)
{

    $check = TRUE;  
    $i = 0;

    while($check == TRUE)
    {
        if($match[$i] == $value->meta_key)
        {
            echo $i . ' ';
            echo ' inne ';
            $check = FALSE;
            break;
        }   

        $i++;   
    }
}

4 个答案:

答案 0 :(得分:2)

您应该检查值$match[$i]是否存在。很明显,您的错误消息会发生,因为它有时不会。

所以,你可以这样做:

if(isset($match[$i]) && $match[$i] == $value->meta_key) {
    ...
}

或者您可以用以下内容替换foreach循环中的完整部分:

for($i=0; $i<count($match); $i++) {
    if($match[$i] == $value->meta_key) {
        ...
        break;
    }
}

这样你就可以确保你永远不会出界。

你做错了的主要是你离开while循环的条件只有在你有一个匹配时才会被捕获,而不是在到达数组的末尾时(你从未测试过)。

答案 1 :(得分:0)

显然$value->meta_key$match项中的任何一项都不相等,因此if不会break循环和$i增加超过$match长度。

答案 2 :(得分:0)

只需在while循环中添加一个条件

// with * we are doing tag indepenedent search. If you know the tag, say it's a `div`, then //div[contains(text(),'Text To find')] can be done
By byXpath = By.xpath("//*[contains(text(),'Text To find')]"); 
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(byXpath));

答案 3 :(得分:0)

轻松一点:

// This line only for test
$results = array((object) array('meta_key'=>'shipping_state'), (object) array('meta_key'=>'bla-bla'));

foreach($results as $value)
{
    if (false !== ($i = array_search($value->meta_key, $match))) {
            echo $i . ' ';
            echo ' inne ';
    }
}