foreach с тремя переменными - PullRequest
1 голос
/ 13 октября 2011

я хочу использовать функцию foreach для 3 переменных

я использую этот код на своей странице:

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) { 
?>

спасибо

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

Я думаю, это решит вашу проблему:

<?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";
}
1 голос
/ 19 октября 2011

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 .

0 голосов
/ 13 октября 2011
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'),
    ...
);
0 голосов
/ 13 октября 2011

Я не верю, что это возможно с array_combine и foreach, потому что они работают конкретно с ключом / значением пар в ассоциативном массиве.В PHP нет кортежей в качестве встроенной структуры данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...