【问题标题】:How to print two array at the same time in a foreach loop? [duplicate]如何在 foreach 循环中同时打印两个数组? [复制]
【发布时间】:2012-10-24 09:58:54
【问题描述】:

可能重复:
Iterate through two associative arrays at the same time in PHP

我有两个数组 $name[]$type[]。我想像这样通过foreach循环打印那些arraya,

<?php
foreach($name as $v && $type as $t)
{
echo $v;
echo $t;
}
?>

我知道这是错误的方法,然后告诉我正确的方法。

【问题讨论】:

  • 两个数组的长度是否总是相同的?
  • @deceze:我确定这是某事的欺骗,而不是那个。

标签: php foreach


【解决方案1】:

你不能那样做。您需要执行以下操作之一:

  1. 使用for 循环并“共享”索引变量,或者
  2. each 和朋友一起手动迭代,或者
  3. 将两个数组与array_map一起压缩

for为例:

for ($i = 0; $i < count($name); ++$i) {
    echo $name[$i];
    echo $type[$i];
}

可能的问题:数组需要进行数字索引,如果它们的长度不同,那么使用count 的数组很重要。您应该以较短的数组为目标,或者采取适当的措施,避免越界索引较长的数组。

each 为例:

reset($name);  // most of the time this is not going to be needed,
reset($type);  // but let's be technically accurate

while ((list($k1, $n) = each($name)) && (list($k2, $t) = each($type))) {
    echo $n;
    echo $t;
}

可能的问题:如果数组的长度不同,那么这将在“较短”数组用完后停止处理元素。您可以通过将|| 替换为&amp;&amp; 来更改它,但是您必须考虑$n$t 之一并不总是具有有意义的值。

array_map 为例:

// array_map with null as the callback: read the docs, it's documented
$zipped = array_map(null, $name, $type);

foreach($zipped as $tuple) {
    // here you could do list($n, $t) = $tuple; to get pretty variable names
    echo $tuple[0]; // name
    echo $tuple[1]; // type
}

可能的问题:如果两个数组的长度不同,那么较短的数组将用空值扩展;你无法控制这个。此外,虽然这种方法很方便,但确实会占用额外的时间和内存。

【讨论】:

  • @Ravneet'Abid':在这种情况下是一样的。只是偏好。
  • 谢谢哥们。非常感谢
  • 哦,选项 3 非常漂亮。
  • 感谢您提供此示例。我担心我必须对多维数组进行硬编码(而且我不理解这些,所以我现在有点避免使用它们)。我发现 array_map 是我工作中最有条理的方法
【解决方案2】:

如果数组总是相同的长度,并且元素是唯一的,并且如果$name 的所有值都是字符串或整数,则可以使用array_combine

foreach (array_combine($name, $type) as $v => $t) {
    echo $v, $t;
}

array_combine 创建一个新数组,第一个数组的元素提供键,而第二个数组的元素提供值。

【讨论】:

  • 不错的构想,但由于数组键只能是字符串和整数,因此无法全面使用。
  • @Jon 一个很好的观点。当然,您可以使用serialize,但这太愚蠢了!
  • 有一个晦涩难懂的技巧,与 array_mapnull 回调类似,如果需要,请查看我的答案中的第三个选项 :)
【解决方案3】:

您可以在 while 循环中使用手动数组迭代函数 next()reset()current()

reset($a);
reset($b);

while( (next($a) !== false) || (next($b) !== false)){
    $t = current($a);
    $v = current($b);
}

【讨论】:

    【解决方案4】:

    你可以这样做

    for ($i = 0; $i < max(count($name), count($type)); $i++) { 
        if(isset($name[$i]))
            echo 'name[' . $i . '] = ' . $name[$i];  
        if(isset($type[$i]))
            echo 'type[' . $i . '] = ' . $type[$i]; 
    } 
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2023-04-10
      • 1970-01-01
      • 2020-01-14
      • 2010-10-07
      • 1970-01-01
      • 2015-07-11
      相关资源
      最近更新 更多