4

可能重复:
在 PHP 中同时遍历两个关联数组

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

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

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

4

4 回答 4

10

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

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

可能的问题:如果数组的长度不同,那么这将在“较短”数组用完后停止处理元素。您可以通过交换 来更改它||&&但是您必须考虑其中一个$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
}

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

于 2012-10-24T10:00:06.340 回答
1

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

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

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

于 2012-10-24T10:02:06.013 回答
0

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

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

while( (next($a) !== false) || (next($b) !== false)){
    $t = current($a);
    $v = current($b);
}
于 2012-10-24T10:02:57.277 回答
-1

你可以这样做

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]; 
} 
于 2012-10-24T10:04:13.190 回答