Я хочу использовать функцию foreach для трех переменных
Я использую этот код на своей странице:
foreach (array_combine($online_order_name, $online_order_q) as $online_order_name1 => $online_order_q1) { mysql_query("insert into ....... }
как я могу это сделать:
<? foreach (array_combine($online_order_name, $online_order_q,$third_variable) as $online_order_name1 => $online_order_q1 => $third_variable2) { ?>
Спасибо
Я думаю, это решит вашу потребность:
<?php $A=array(1,2,3); $B=array('a','b','c'); $C=array('x','y','z'); foreach (array_map(NULL, $A, $B, $C) as $x) { list($a, $b, $c) = $x; echo "$a $b $c\n"; }
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 loop .
Я не думаю, что это возможно с помощью array_combine
и foreach
, потому что они работают конкретно на парах ключ / значение в ассоциативном массиве. PHP не имеет кортежей как встроенную структуру данных.
for ($i = 0, $length = count($array1); $i < $length; $i++) { list($a, $b, $c) = array($array1[$i], $array2[$i], $array3[$i]); ... }
Вы должны думать о лучшей структуре массива, хотя это не требует, чтобы вы извлекали информацию из трех разных массивов. Что-то вроде:
$orders = array( array('name' => 'Foo', 'q' => 'bar', 'third' => 'Baz'), ... );