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

이 방법은 저에게 효과적이지 않았습니다. 어떤 제안?

답변:


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

또는 다른 답변에서 볼 수 있듯이 연관 배열을 대신 하드 코딩 할 수 있습니다.


3 개의 어레이에도 사용할 수 있습니까?
xjshiya 2014-06-16

@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
음 ... 반대 투표를 요청하지 않았습니다. Downvoter, 이유 및 정교하게 관심? 분명히 "그냥 사촌"입니다. Meh ~
Funk Forty Niner 2011

4
이 모든 것이 똑같지 않습니까? 변수 이름 외에는 큰 차이가 없습니다.
Patrick

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++;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.