4

重複の可能性:
PHP で同時に 2 つの連想配列を反復処理する

私は2つの配列$name[]$type[]. このように foreach ループを介してこれらの配列を出力したいのですが、

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

これが間違った方法であることはわかっているので、正しい方法を教えてください。

4

4 に答える 4

10

そんなことはできません。次のいずれかを実行する必要があります。

  1. ループを使用しforてインデックス変数を「共有」するか、または
  2. each友人と手動で繰り返す、または
  3. 2つの配列を一緒に圧縮します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
}

考えられる問題: 2 つの配列の長さが同じでない場合、短い方が null で拡張されます。これを制御することはできません。また、このアプローチは便利ですが、追加の時間とメモリを使用します。

于 2012-10-24T10:00:06.340 に答える
1

配列が常に同じ長さで、要素が一意で、すべての値$nameが文字列または整数である場合は、次を使用できますarray_combine

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

array_combine最初の配列の要素がキーを提供し、2 番目の配列の要素が値を提供する新しい配列を作成します。

于 2012-10-24T10:02:06.013 に答える
0

手動の配列反復関数を使用できnext()reset()whilecurrent()ループで:

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 に答える