foreach php声明

时间:2010-01-08 11:36:54

标签: php loops foreach

我需要将两个foreach语句组合成一个例如

foreach ($categories_stack as $category)
foreach ($page_name as $value)

我需要将它们添加到相同的foreach语句

如果是这样可以吗?

7 个答案:

答案 0 :(得分:4)

(我不确定我是否完全理解了你的问题。我假设你想要并行迭代这两个列表)

您可以使用for循环执行此操作,如下所示:

$n = min(count($category), count($value));
for($c = 0; $c < $n; $c = $c + 1){
    $categories_stack = $category[$c];
    $pagename = $value[$c];
    ...
}

要实现与foreach相同的功能,您需要一个类似于Python的zip()函数的函数。

在Python中,它将是:

for categories_stack, pagename in zip(categories, values):
     print categories_stack, pagename

由于PHP没有标准的zip()函数,因此您必须自己编写这样的函数,或者使用for循环解决方案。

答案 1 :(得分:3)

如果你想要的话,你可以做嵌套的foreach。但是,如果不了解更多数据,就不可能说这是否有帮助:

foreach ($categories_stack as $category) {
    foreach ($page_name as $value) {
    }
}

您可能希望打印出某个类别中的所有页面?这可能不会起作用,那么你可以提供一些有关阵列外观和相互关系的信息吗?

答案 2 :(得分:2)

此循环将继续到最长数组的长度,并返回null,以便在任何一个数组中没有匹配的元素。试试吧!

$a = array(1 => "a",25 => "b", 10 => "c",99=>"d");
$b = array(15=>1,5=>2,6=>3);

$ao = new ArrayObject($a);
$bo = new ArrayObject($b);
$ai = $ao->getIterator();
$bi = $bo->getIterator();
for (
    $ai->rewind(),$bi->rewind(),$av = $ai->current(),$bv = $bi->current();
    list($av,$bv) =
        array(
            ($ai->valid() ? $ai->current() : null),
            ($bi->valid() ? $bi->current() : null)
        ), 
    ($ai->valid() || $bi->valid());
    ($ai->valid() ? $ai->next() : null),($bi->valid() ? $bi->next() : null))
{
    echo "\$av = $av\n";
    echo "\$bv = $bv\n";
}

我无法确切地从问题中确切地告诉您如何遍历这两个数组。对于嵌套的foreach,您只需编写

foreach ($myArray as $k => $v) {
    foreach ($mySecondArray as $kb => $vb {
    }
}

但是,你可以通过一些创造性的回调函数来做各种事情。在这种情况下,匿名函数在每次迭代时从每个数组返回两个项。然后很容易将迭代值用作数组或使用list()将其拆分为变量,如下所示。

无论关键结构如何,这都有额外的好处。我纯粹基于数组元素的排序。如果元素出现故障,只需使用适当的排序功能。

由于没有报告错误,因此不担心数组的长度,因此请务必留意空值。

$a = array("a","b","c");
$b = array(1,2,3);
foreach (
        array_map(
            create_function(
                '$a,$b', 'return array($a,$b);'
            )
            ,$a,$b
        )
        as $value
    ) 
{
    list($a,$b) = $value;
    echo "\$a = $a\n";
    echo "\$b = $b\n";
}

输出

$a = a
$b = 1
$a = b
$b = 2
$a = c
$b = 3

这是另一个停止在任何一个列表结束的人。与使用min(count(a),count(b)相同。如果你有相同长度的数组,这很有用。如果有人可以继续max(count(a),count(b))让我知道。

$ao = new ArrayObject($a);
$bo = new ArrayObject($b);
$ai = $ao->getIterator();
$bi = $bo->getIterator();
for (
    $ai->rewind(),$bi->rewind();
    $av = $ai->current(),$bv=$bi->current();
    $ai->next(),$bi->next())
{
    echo "\$av = $av\n";
    echo "\$bv = $bv\n";
}

答案 3 :(得分:1)

这就是古老的for循环派上用场的地方:

for(
    $i = 0,
    $n = sizeof($categories_stack),
    $m = sizeof($page_name);

    $i < $n && $i < $m;

    $i++
) {
    $category = $categories_stack[$i];
    $value = $page_name[$i];

    // do stuff here ....
}

答案 4 :(得分:1)

当然你可以在循环之前合并数组吗?

$data = array_merge($categories_stack, $page_name);

foreach($data AS $item){
...
}

答案 5 :(得分:0)

您可以将它们与foreach范围之外的变量嵌套,或者将内容存储为类似于KVP设置的数组吗?我的回答很模糊,但我不确定你为什么要这样做。

答案 6 :(得分:0)

数组元素是否彼此直接对应,即$page_name中每个元素的$categories_stack中是否有元素?如果是这样,只需迭代键值(假设它们具有相同的键):

foreach ($categories_stack as $key => $value)
{
    $category = $value;
    $page = $page_name[$key];

    // ...
}