foreach循环中的两个数组


98

我想selectbox使用两个数组生成一个,一个包含国家/地区代码,另一个包含国家/地区名称。

这是一个例子:

<?php
    $codes = array('tn','us','fr');
    $names = array('Tunisia','United States','France');

    foreach( $codes as $code and $names as $name ) {
        echo '<option value="' . $code . '">' . $name . '</option>';
    }
?>

这种方法对我不起作用。有什么建议?

Answers:


155
foreach( $codes as $code and $names as $name ) { }

那是无效的。

您可能想要这样的东西...

foreach( $codes as $index => $code ) {
   echo '<option value="' . $code . '">' . $names[$index] . '</option>';
}

另外,使代码成为$names数组的键会容易得多...

$names = array(
   'tn' => 'Tunisia',
   'us' => 'United States',
   ...
);

在解析表单字段数组时很有用。
Ryu_hayabusa 2014年

85

foreach 一次只能操作一个阵列。

数组的结构方式,可以将array_combine()它们分为键值对数组和foreach单个数组:

foreach (array_combine($codes, $names) as $code => $name) {
    echo '<option value="' . $code . '">' . $name . '</option>';
}

或者从其他答案中可以看出,您可以改为硬编码关联数组。


这也可以用于三个数组吗?
xjshiya 2014年

@xjshiya不,如果给他们3个参数,则会得到警告:array_combine()恰好需要2个参数,给定3个参数
Julian


6

使用关联数组:

$code_names = array(
                    'tn' => 'Tunisia',
                    'us' => 'United States',
                    'fr' => 'France');

foreach($code_names as $code => $name) {
   //...
}

我相信使用关联数组是最明智的方法,而不是使用,array_combine()因为一旦有了关联数组,您就可以简单地使用array_keys()array_values()获得与以前完全相同的数组。


+1 array_combine()已经产生了一个关联数组,您可能想更清楚地初始化为关联数组。
BoltClock

4

array_map似乎对此也有好处

$codes = array('tn','us','fr');
$names = array('Tunisia','United States','France');

array_map(function ($code, $name) {
    echo '<option value="' . $code . '">' . $name . '</option>';
}, $codes, $names);

其他好处包括:

  • 如果一个数组比另一个数组短,则回调null函数会接收值以填补空白。

  • 您可以使用2个以上的数组来迭代。


3

为什么不将其合并为多维关联数组呢?似乎您要解决此错误:

$codes = array('tn','us','fr');
$names = array('Tunisia','United States','France');

变成:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');

1
它称为关联数组,而不是多维数组。
BoltClock

3

全部经过充分测试

从数组创建动态下拉列表的3种方法。

这将从数组创建一个下拉菜单,并自动分配其各自的值。

方法1(普通数组)

<?php

$names = array('tn'=>'Tunisia','us'=>'United States','fr'=>'France');

echo '<select name="countries">';

foreach($names AS $let=>$word){
    echo '<option value="'.$let.'">'.$word.'</option>';
}
echo '</select>';
 
?>


方法2(普通数组)

<select name="countries">

<?php

$countries = array('tn'=> "Tunisia", "us"=>'United States',"fr"=>'France');
foreach($countries as $select=>$country_name){
echo '<option value="' . $select . '">' . $country_name . '</option>';
}
?>

</select>


方法3(关联数组)

<?php

$my_array = array(
     'tn' => 'Tunisia',
     'us' => 'United States',
     'fr' => 'France'
);

echo '<select name="countries">';
echo '<option value="none">Select...</option>';
foreach ($my_array as $k => $v) {
    echo '<option value="' . $k . '">' . $v . '</option>';
}
echo '</select>';
?>

1
嗯。。。下注者,理由和关心要详细说明?显然做了“只是因为”。咩〜
芬克四十Niner

4
这些不是一回事吗?除了变量的名称外,我没有看到其他任何显着差异。
帕特里克

3

foreach仅适用于单个数组。要遍历多个数组,最好在while循环中使用each()函数:

while(($code = each($codes)) && ($name = each($names))) {
    echo '<option value="' . $code['value'] . '">' . $name['value'] . '</option>';
}

each()返回有关当前键和数组值的信息,并将内部指针加1,如果到达数组的末尾,则返回false。该代码将不依赖于具有相同键或具有相同种类元素的两个数组。当两个数组之一完成时,循环终止。


3

这对我有用:

$codes = array('tn', 'us', 'fr');
$names = array('Tunisia', 'United States', 'France');
foreach($codes as $key => $value) {
    echo "Code is: " . $codes[$key] . " - " . "and Name: " . $names[$key] . "<br>";
}

它可以工作,但是更清楚的是,具有一个以代码作为键并将名称作为值的单个数组...
Ferdinand.kraft

2

您可以使用array_merge组合两个数组,然后对其进行迭代。

$array1 = array("foo" => "bar");
$array2 = array("hello" => "world");
$both_arrays = array_merge((array)$array1, (array)$array2);
print_r($both_arrays);

2

走出来...

$codes = array('tn','us','fr');
$names = array('Tunisia','United States','France');
  • PHP 5.3以上

    array_walk($codes, function ($code,$key) use ($names) { 
        echo '<option value="' . $code . '">' . $names[$key] . '</option>';
    });
  • 在PHP 5.3之前

    array_walk($codes, function ($code,$key,$names){ 
        echo '<option value="' . $code . '">' . $names[$key] . '</option>';
    },$names);
  • 或结合

    array_walk(array_combine($codes,$names), function ($name,$code){ 
        echo '<option value="' . $code . '">' . $name . '</option>';
    })
  • 在选择

    array_walk(array_combine($codes,$names), function ($name,$code){ 
        @$opts = '<option value="' . $code . '">' . $name . '</option>';
    })
    echo "<select>$opts</select>";

演示


2
<?php

$codes = array ('tn','us','fr');
$names = array ('Tunisia','United States','France');

echo '<table>';

foreach(array_keys($codes) as $i) {

     echo '<tr><td>';
     echo ($i + 1);
     echo '</td><td>';
     echo $codes[$i];
     echo '</td><td>';
     echo $names[$i];
     echo '</td></tr>';
}

echo '</table>';

?>

2

代替foreach循环,请尝试此操作(仅当数组长度相同时)。

$number = COUNT($_POST["codes "]);//count how many arrays available
if($number > 0)  
{  
  for($i=0; $i<$number; $i++)//loop thru each arrays
  {
    $codes =$_POST['codes'][$i];
    $names =$_POST['names'][$i];
    //ur code in here
  }
}

1

我认为您可以执行以下操作:

$ codes = array('tn','us','fr');

$ names = array('突尼斯','美国','法国');

foreach ($codes as $key => $code) {
    echo '<option value="' . $code . '">' . $names[$key] . '</option>';
}

它也应适用于关联数组。


1

我认为最简单的方法就是这样使用for循环:

$codes = array('tn','us','fr');
$names = array('Tunisia','United States','France');

for($i = 0; $i < sizeof($codes); $i++){
    echo '<option value="' . $codes[$i] . '">' . $names[$i] . '</option>';
}

1

这样的代码是不正确的,因为foreach仅适用于单个数组:

<?php
        $codes = array('tn','us','fr');
        $names = array('Tunisia','United States','France');

        foreach( $codes as $code and $names as $name ) {
            echo '<option value="' . $code . '">' . $name . '</option>';
            }
?>

或者,更改为:

<?php
        $codes = array('tn','us','fr');
        $names = array('Tunisia','United States','France');
        $count = 0;

        foreach($codes as $code) {
             echo '<option value="' . $code . '">' . $names[count] . '</option>';
             $count++;
        }

?>

0

array_combine()对我很有效,同时将$_POST来自多个表单输入的多个值组合在一起,以尝试更新购物车中的产品数量。


0
if(isset($_POST['doors'])=== true){
$doors = $_POST['doors'];
}else{$doors = 0;}

if(isset($_POST['windows'])=== true){
$windows = $_POST['windows'];
}else{$windows = 0;}

foreach($doors as $a => $b){

现在您可以为每个数组使用$ a...。

$doors[$a]
$windows[$a]
....
}

0

我通过这种方式解决了像您这样的问题:

foreach(array_keys($idarr) as $i) {
 echo "Student ID: ".$idarr[$i]."<br />";
 echo "Present: ".$presentarr[$i]."<br />";
 echo "Reason: ".$reasonarr[$i]."<br />";
 echo "Mark: ".$markarr[$i]."<br />";
}

0

您应该尝试将2数组放入singlr foreach循环中假设我有2数组1. $ item_nm 2. $ item_qty

 `<?php $i=1; ?>
<table><tr><td>Sr.No</td> <td>item_nm</td>  <td>item_qty</td>    </tr>

  @foreach (array_combine($item_nm, $item_qty) as $item_nm => $item_qty)
<tr> 
        <td> $i++  </td>
        <td>  $item_nm  </td>
        <td> $item_qty  </td>
   </tr></table>

@endforeach `

0

很少有数组也可以像这样迭代:

foreach($array1 as $key=>$val){ // Loop though one array
    $val2 = $array2[$key]; // Get the values from the other arrays
    $val3 = $array3[$key];
    $result[] = array( //Save result in third array
      'id' => $val,
      'quant' => $val2,
      'name' => $val3,
    );
  }

-2

这个对我有用

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.