foreach
выполняет итерацию только для одного итератора и предлагает один ключ и одно значение. Вот как итераторы определены в PHP.
В своем вопросе вы пишете, что вам нужно несколько значений (но не ключей, но я думаю, что это не повредит). Это не работает из коробки.
Однако вы можете создать итератор, который позволяет выполнять итерацию сразу по нескольким итераторам. Базовый класс поставляется с PHP, он называется MultipleIterator
. Затем вы можете создать свой собственный ForEachMultipleArrayIterator
, который позволит вам легко указать несколько ключей и значений для каждой итерации:
$a = array(1,2,3);
$b = array('b0' => 'a', 'b1' => 'b', 'b2' => 'c');
$c = array('c0' => 'x', 'c1' => 'y', 'c2' => 'z');
$it = new ForEachMultipleArrayIterator(
// array keyvar valuevar
array($a, 'akey' => 'avalue'),
array($b, 'bkey' => 'bvalue'),
array($c, 'ckey' => 'cvalue')
);
foreach($it as $vars)
{
extract($vars);
echo "$akey=$avalue, $bkey=$bvalue and $ckey=$cvalue \n";
}
class ForEachMultipleArrayIterator extends MultipleIterator
{
private $vars;
public function __construct()
{
parent::__construct();
$arrays = func_get_args();
foreach($arrays as $set)
{
if (count($set) != 2)
throw new invalidArgumentException('Not well defined.');
$array = array_shift($set);
if (!is_array($array))
throw new InvalidArgumentException('Not an array.');
$this->vars[key($set)] = current($set);
parent::attachIterator(new ArrayIterator($array));
}
}
public function current()
{
return array_combine(array_keys($this->vars), parent::key())
+ array_combine($this->vars, parent::current());
}
}
Демонстрация - Но если вы зайдете так далеко, я почти уверен, что ясно, что то, что вы хотите сделать, может быть решено намного проще, фактически перебирая что-то еще. Приведенный выше пример в основном такой же, как:
foreach(array_map(NULL, array_keys($a), $a, array_keys($b), $b, array_keys($c), $c) as $v)
{
list($akey, $avalue, $bkey, $bvalue, $ckey, $cvalue) = $v;
echo "$akey=$avalue, $bkey=$bvalue and $ckey=$cvalue \n";
}
Так что лучше приведите массивы в правильный порядок, а затем обработайте их:)
См. Также: Несколько индексных переменных в цикле PHP foreach .