Два массива в цикле foreach
Я хочу создать 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>';
}
?>
этот метод не работал для меня. Есть предложения?
22 ответов
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',
...
);
foreach
одновременно работает только с одним массивом.
как структурирован Ваш массив, вы можете array_combine()
их в массив пар ключ-значение, то foreach
что один массив:
foreach (array_combine($codes, $names) as $code => $name) {
echo '<option value="' . $code . '">' . $name . '</option>';
}
или, как видно из других ответов, вы можете жестко закодировать ассоциативный массив.
использовать array_combine()
чтобы объединить массивы вместе и повторить результат.
$countries = array_combine($codes, $names);
используйте ассоциативный массив:
$code_names = array(
'tn' => 'Tunisia',
'us' => 'United States',
'fr' => 'France');
foreach($code_names as $code => $name) {
//...
}
Я считаю, что использование ассоциативного массива является наиболее разумным подходом в отличие от использования array_combine()
потому что, как только у вас есть ассоциативный массив, вы можете просто использовать array_keys()
или array_values()
чтобы получить точно такой же массив, что и раньше.
почему бы просто не закрепить в многомерная ассоциативный массив? Кажется, вы идете об этом неправильно:
$codes = array('tn','us','fr');
$names = array('Tunisia','United States','France');
будет:
$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
все полностью протестированы
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>';
?>
вы можете использовать array_merge для объединения двух массивов,а затем перебирать их.
$array1 = array("foo" => "bar");
$array2 = array("hello" => "world");
$both_arrays = array_merge((array)$array1, (array)$array2);
print_r($both_arrays);
ходит...
$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>'; })
-
в select
array_walk(array_combine($codes,$names), function ($name,$code){ @$opts = '<option value="' . $code . '">' . $name . '</option>'; }) echo "<select>$opts</select>";
<?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>';
?>
вместо цикла 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
}
}
это сработало для меня:
$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>";
}
Я думаю, что вы можете сделать что-то вроде:
$codes = array ('tn', 'us', 'fr');
$names = array ('Tunisia','United States','France');
foreach ($codes as $key => $code) {
echo '<option value="' . $code . '">' . $names[$key] . '</option>';
}
Он также должен работать для ассоциативных массивов.
Я думаю, самый простой способ-просто использовать цикл 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>';
}
foreach работает только с одним массивом. Чтобы пройти через несколько массивов, лучше использовать функцию each () в цикле while:
while(($code = each($codes)) && ($name = each($names))) {
echo '<option value="' . $code['value'] . '">' . $name['value'] . '</option>';
}
each () возвращает информацию о текущем ключе и значении массива и увеличивает внутренний указатель на единицу или возвращает false, если он достиг конца массива. Этот код не будет зависеть от двух массивов, имеющих одинаковые ключи или имеющих одинаковые элементы. Цикл завершается, когда один из двух массивов закончена.
array_combine()
отлично работал для меня при объединении $_POST
несколько значений из нескольких входных данных формы в попытке обновить количество продуктов в корзине покупок.
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]
....
}
Я решил проблему, подобную вашей, следующим образом:
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 />";
}
вы должны попробовать это для размещения массива 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 `
несколько массивов также могут быть повторены следующим образом:
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,
);
}
ваш код, как это неверно, как 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++;
}
?>
это работает для меня
$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
Если бы можно было делать, как вам нравится, foreach для 2 массивов был бы запрограммирован следующим образом:
//foreach ($array1 as $key1 [,/and/~/'/-/whatever] $array2 as $key2)
//equals:
$array1 = array();
$array2 = array();
if (sizeof(array1) == sizeof(array2)){
for ($i = 0; i < sizeof(array1) , i++){
$key1 = $array1[$i]
$key2 = $array2[$i]
//the code
}}
мое решение не идеально, но хорошо для большинства целей.