【问题标题】:Access variable from inside a nested foreach statement PHP从嵌套的 foreach 语句 PHP 中访问变量
【发布时间】:2010-12-15 16:28:47
【问题描述】:

我从多维数组中的给定值获取键。它工作正常,只是我似乎无法从我用来获取密钥的嵌套 foreach 循环外部访问变量。

所以我的 foreach 循环是:($name_books 是包含 3 个较小数组的多维数组)

foreach($name_books as $test) {
    foreach ($test as $key => $value) {
    $book_code = array_search($row['name'],$test);
    echo $book_code; //just to see if it works, which it does
    break;
        } 
    }
//But then if I go outside of the loop..

echo $book_code." is the book code"; // <--DOES NOT WORK

所以我知道我在这里处理变量范围问题,我尝试在 foreach 循环中声明全局变量,但没有任何效果。

我确定我缺少一些简单得离谱的东西!

编辑:

urg..我后退了一步,意识到其他事情, 所有这些都发生在一个while循环中(从数据库中获取东西)

所以代码更像:

while($row=mysql_fetch_assoc($result)) {

   ...original foreach loop from above

}

很抱歉没有包括这个,我专注于这个小块,忘记备份并查看它适合的位置。

【问题讨论】:

    标签: php


    【解决方案1】:
    break;
    

    只会退出内部嵌套的foreach。如果$name_books 中有更多行,它将继续循环并最终用来自array_search 的'false' 值覆盖$book_code

    找到所需的值后,使用:

    break 2;
    

    关于您的编辑,您中断的位置取决于您对$book_code 找到的值所做的操作。如果您不打算继续,请更改break 的参数。 break 3; 也将退出 while 循环。根据嵌套级别更改值。

    【讨论】:

    • 我不知道break接受了参数;看来我今天学到了一些新东西。
    • 这对我来说也是新闻。好帖子。
    【解决方案2】:

    这与变量范围无关,只要您发布的内容正是您在脚本中的内容。

    我认为问题在于,您只是打破了内部循环。在外循环的每次迭代中,$book_code 都会发生变化,因此您也需要停止外循环。尝试将break; 更改为break 2;,看看它是否能解决您的问题。这会导致它脱离内循环和外循环。

    编辑:我认为您还可以简化代码:

    foreach ($name_books as $test) {
        $book_code = array_search($row['name'], $test);
        if ($book_code !== FALSE) {
            break;
        }
    }
    如果我对你的结构有更多的了解,这可能会简化为单个 SQL 语句和 0 个循环。

    【讨论】:

    • 你打字的速度比我快很多,而且首先得到了答案。
    • 谢谢你,我以前从来没有使用过除了默认中断之外的任何东西。但是,我忘记了我没有包括整个图片! (对不起!)见我上面的编辑。
    • 就是这样,谢谢!我仍然有点困惑为什么这有效,而我的却没有——我会再研究一下。但是非常感谢您的帮助。
    【解决方案3】:

    simshaun 是对的,但我实际上会采取不同的方法。

    我会在我的 foreach 循环中检查 $book_code 的存在,而不是处理中断。

    新代码

    foreach($name_books as $test) {
        foreach ($test as $key => $value) {
            if(!isset($book_code)){
                $book_code = array_search($row['name'],$test);
                echo $book_code; //just to see if it works, which it does
            }
        } 
    }
    
    echo $book_code." is the book code";
    

    【讨论】:

    • 我不同意。不打破两个循环意味着它必须完成不必要的数组迭代。虽然实际上,除非数组非常大,否则效率不会显着,但打破循环的效率要高得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多