我需要将两个foreach
语句组合成一个例如
foreach ($categories_stack as $category)
foreach ($page_name as $value)
我需要将它们添加到相同的foreach
语句
如果是这样可以吗?
答案 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];
// ...
}