【问题标题】:php: foreach() how to assign to two variablesphp: foreach() 如何赋值给两个变量
【发布时间】:2012-03-07 03:55:46
【问题描述】:
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;
}

回答以下一些问题以及我想要达到的目标。

  1. 数组$choices 没有数字索引。
  2. 数组$vtitle 被数字索引。
  3. 它们不会比彼此短,因为我有代码会在此代码运行之前处理此问题。
  4. 我正在尝试返回$options 变量。问题是$choices[0]$vtitle[0] 只能使用一次。希望我能够表达我的问题。
  5. 我不想为$choices 中的每个值遍历一次$vtitles 数组。

@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);
}

【问题讨论】:

  • 你的数组有数字索引吗?
  • 如果一个数组比另一个数组短会怎样?
  • 定义$key两次肯定会出问题。
  • PHP 不能那样工作。如果count($arrA) == 5 和 count($arrB) == 50,你会期待什么?

标签: php foreach


【解决方案1】:

您需要使用两个 foreach 循环。

foreach ($choices as $keyChoice => $choice)
{
    foreach ($vtitles as $keyVtitle => $vtitle)
    {
        //Code to work on values here
    }
}

【讨论】:

  • 没错,我想问题是示例代码的真正意图是什么?
  • 我之前试过这个,但我不能用这个。因为我有里面的代码然后出错了。还有其他方法吗?
  • @vishal 检查我对问题本身的评论并编辑问题以澄清,我们可以为您提供更好的答案。我们需要知道你想用 for each 循环来完成什么。
【解决方案2】:

您可能需要重新调整您的逻辑来做您想做的事。有什么理由不能只使用 2 个 foreach 循环?还是一个嵌套在另一个里面?

编辑:正如其他人所指出的那样,如果 PHP 确实支持您正在尝试做的事情,那么它根本不安全.. 所以它不支持可能是一件好事 :)

【讨论】:

    【解决方案3】:

    如果键相同,可以这样做:

    foreach ($choices as $key => $choice) {
        $vtitle = $vtitles[$key];
    }
    

    【讨论】:

      【解决方案4】:

      简答,不。

      你可以做的是:

      foreach ($array1 as $k => $v)
          performMyLogic($k, $v);
      
      foreach ($array2 as $k => $v)
          performMyLogic($k, $v);
      

      【讨论】:

        【解决方案5】:

        在一般情况下,您不能在 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);
        }
        

        【讨论】:

        • 这只有在两个数组具有相同数量的元素时才有效,不是吗?
        • 看作者想要什么
        • @alex347:我在my answer 中有点走同样的方向:首先是基于迭代器的示例,然后是基于while 的第二个示例。
        【解决方案6】:

        它不像你用你的伪代码勾勒出来的那样工作。但是,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)


        另请参阅相关问题:Multiple index variables in PHP foreach loop

        【讨论】:

        • 我不知道这...很有趣。
        • 如果数组大小不同怎么办?一个键是否为空,而另一个键有值?
        • @crush:默认行为是它只会迭代有效的对,例如如果一个数组有两个成员,另一个有 10 个,它只会遍历前两对。但是您可以使用标志来更改它,请参阅 PHP 手册的链接。 - MultipleIterator::MIT_NEED_ANY Demo(是的,NULL)。
        • 太棒了。这值得+1。现在的问题是开销值得哈哈。
        • @hakre 我将您的建议与 spl 一起使用,但出现错误。我已经用错误更新了我的帖子。可能出了什么问题? ,谢谢
        【解决方案7】:

        也许你想要这个:

        //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
            }
        }
        

        但是如果大小相同,这将起作用。但是您可以更改此代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-30
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-10
          相关资源
          最近更新 更多