2010-12-15 45 views
0

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

所以我的foreach循环是:($ name_books是多d数组,它包含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..I退后了一步,实现了别的东西, 这一切都是在while循环中(得到的东西从DB)发生

,使代码更喜欢:如果不包括这个,我很关注这件小事,忘记备份并看看它适合哪里。

回答

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循环。

+0

您键入快了很多,比我做的,并得到你的答案在第一位。 – labue 2010-12-15 16:48:49

+0

感谢这一点,我从来没有用过任何东西,但默认中断之前。但是,我忘了我没有包括全部图片! (对不起!)看到我上面的编辑。 – dijon 2010-12-15 16:50:45

+0

就是这样,谢谢!我仍然有点困惑,为什么这个工作,而我没有 - 我会再研究一下。但非常感谢你的帮助。 – dijon 2010-12-15 16:59:06

5
break; 

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

一旦你找到你要找的值,可以使用:

break 2; 

关于你的编辑,在那里你打破取决于你发现你正在与价值做什么为$book_code。如果您不打算继续,请更改break的参数。 break 3;也将退出while循环。根据嵌套的级别更改值。

+0

我不知道break是否接受了一个参数;看起来我今天学到了一些新东西。 – Craige 2010-12-15 16:41:39

+0

这对我来说也是新闻。好帖子。 – Dutchie432 2010-12-15 16:44:19

+0

非常好,谢谢关于休息的信息。 – dijon 2010-12-15 17:04:39

1

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"; 
+1

我不同意。不打破两个循环意味着它必须完成不必要的迭代。虽然实际上,除非阵列非常大,否则效率不会很明显,突破循环效率更高。 – simshaun 2010-12-15 16:40:56

+0

我忽略了一些至关重要的信息!看到我上面的编辑。 – dijon 2010-12-15 16:51:46