function example()
{
foreach ($choices as $key => $choice) { # \__ both should run parallel
foreach ($vtitles as $keystwo => $vtitle) { # /
$options .= '<option value="'. check_plain($key) .'" title="' . $vtitle . '"' . $selected
.'>'. check_plain($choice) .'</option>';
} // end of vtitle
} // end of choice
return $options;
}
回答以下一些问题以及我想要实现的目标。
$choices
未按数字编入索引。$vtitle
以数字方式编入索引。$options
变量。问题是$choices[0]
和$vtitle[0]
只能使用一次。希望我能够表达我的问题。 $vtitles
中的每个值检查一次$choices
数组。@hakre:谢谢我在你的帮助下几乎解决了它。
我收到变量$vtitle
的错误:
InvalidArgumentException: Passed variable is not an array or object, using empty array
instead in ArrayIterator->__construct() (line 35 of /home/vishal/Dropbox/sites/chatter/sites
/all/themes/kt_vusers/template.php).
我确定它是一个数组,这是使用print_r
Array ( [0] => vishalkh [1] => newandold )
可能出现什么问题?
以下为我工作,谢谢你hakre
while
(
(list($key1, $value1) = each($array1))
&& (list($key2, $value2) = each($array2))
)
{
printf("%s => %s, %s => %s \n", $key1, $value1, $key2, $value2);
}
答案 0 :(得分:11)
它与您使用伪代码勾勒的方式不起作用。但是,SPL提供了一种迭代多个迭代器的方法。它被称为MultipleIterator
,您可以根据需要附加任意数量的迭代器:
$multi = new MultipleIterator();
$multi->attachIterator(new ArrayIterator($array1));
$multi->attachIterator(new ArrayIterator($array2));
foreach($multi as $value)
{
list($key1, $key2) = $multi->key();
list($value1, $value2) = $value;
}
查看实际操作:Demo
修改:第一个示例显示了SPL的建议。它的好处是它可以处理任何类型的迭代器,而不仅仅是数组。如果你想用数组表达类似的东西,你可以用经典的while(list()=each())
循环来实现类似的东西,它允许更多的表达式而不是foreach
。
while
(
(list($key1, $value1) = each($array1))
&& (list($key2, $value2) = each($array2))
)
{
printf("%s => %s, %s => %s \n", $key1, $value1, $key2, $value2);
}
Demo (the minimum number of elements are iterated)
答案 1 :(得分:2)
一般情况下你不能在foreach循环中这样做。但你可以在PHP5中这样做:
$obj1 = new ArrayObject($arr1);
$it1 = $obj1->getIterator();
$obj2 = new ArrayObject($arr2);
$it2 = $obj2->getIterator();
while( $it1->valid() && $it2->valid())
{
echo $it1->key() . "=" . $it1->current() . "\n";
$it1->next();
echo $it2->key() . "=" . $it2->current() . "\n";
$it2->next();
}
在旧版本的PHP中,它将是这样的:
while (($choice = current($choices)) && ($vtitle = current($vtitles))) {
$key_choice = key($choices);
$key_vtitle = key($vtitles);
next($choices);
next($vtitles);
}
答案 2 :(得分:1)
简答,不。
你能做的是:
foreach ($array1 as $k => $v)
performMyLogic($k, $v);
foreach ($array2 as $k => $v)
performMyLogic($k, $v);
答案 3 :(得分:0)
您可能需要重新配置逻辑以执行您想要的操作。你有什么理由不能只使用2个foreach循环吗?或者在另一个内嵌一个?
编辑:正如其他人所指出的那样,如果PHP确实支持你想要做的事情,它根本就不安全......所以它可能是一件好事,它不会:)答案 4 :(得分:0)
如果密钥相同,您可以这样做:
foreach ($choices as $key => $choice) {
$vtitle = $vtitles[$key];
}
答案 5 :(得分:0)
也许你想要这个:
//get theirs keys
$keys_choices = array_keys($choices);
$keys_vtitles = array_keys($vtitles);
//the same size I guess
if (count($keys_choices) === count($keys_vtitles)) {
for ($i = 0;$i < count($keys_choices); $i++) {
//First array
$key_1 = $keys_choices[$i];
$value_1 = $choices[$keys_choices[$i]];
//second_array
$key_2 = $key_vtitles[$i];
$value_2 = $vtitles[$keys_vtitles[$i]];
//and you can operate
}
}
但如果尺寸相同,这将有效。但是你可以改变这段代码。
答案 6 :(得分:-1)
你需要使用两个foreach循环。
foreach ($choices as $keyChoice => $choice)
{
foreach ($vtitles as $keyVtitle => $vtitle)
{
//Code to work on values here
}
}