PHP foreach 循环不起作用


PHP foreach loop is not working

我的html表单中有以下多个选择元素(方法-帖子)。我想转换$songs数组以在有序列表中转换。

<select name="songs" multiple>
  <option>song 1</option>
  <option>song 2</option>
  <option>song 3</option>
  <option>song 4</option>
  <option>song 5</option>
  <option>song 6</option>
  <option>song 7</option>
  <option>song 8</option>
  <option>song 9</option>
  <option>...</option>
</select>

我写了以下php代码

 $songs = test_input($_POST["songs"]);
 foreach ($songs as $song) 
 {
   $songs .= "<li>$song</li>";
 };
 $songList = "Songs: <ol> $songs </ol> 'r'n";
 echo $songList;
 function test_input($data)
 {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
 }

但它给了我一个错误Invalid argument supplied for foreach()

有人请告诉这个foreach()循环出了什么问题


如果函数 test_input() 返回 String 而不是 Array那么我应该怎么做才能将$songs转换为有序列表?

以下方法应该有效:

<?php
$songs = $_POST["songs"];
//$songs = Array("one","two","three");
foreach ($songs as $song) 
{
   $songStr = test_input($song);
   $songsOut .= "<li>$songStr</li>";
};
$songList = "Songs: <ol> $songsOut </ol> 'r'n";
echo $songList;
function test_input($data)
{
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>

需要对数组中的每个项目单独调用test_input(),而不是在数组本身上调用。

您确定发布数据实际上是一个数组吗?我用 get 字符串测试了我的代码(所以我可以在浏览器栏中键入它),它需要以下语法:

http://localhost/songs.php?songs[]=one&songs[]=two&songs[]=three

foreach错误消息将解释$POST关联数组不返回值数组,取消注释代码中的第二行将有助于调试此问题。如果您发布生成$POST的代码,我们也可以检查一下!

编辑 - 更改多选元素的名称似乎对我有用:

<select name="songs[]" multiple>
  <option>song 1</option>
  <option>song 2</option>
  <option>song 3</option>
  <option>...</option>
</select>

请参阅: 多选到阵列

那是因为你在循环时正在改变$songs。您应该为 html 字符串使用不同的变量:

 $songs = test_input($_POST["songs"]);
 $html = '';
 foreach ($songs as $song) 
 {
   $html .= "<li>$song</li>";
 }
 $songList = "Songs: <ol> $html </ol> 'r'n";
 echo $songList;

test_input($_POST["songs"]);应该是一个数组,你的代码是完美的。 test_input($_POST["songs"]);但应该返回一个数组

使用函数检查$songs是否为数组is_array()

$songs = array('a','b');
    if (is_array($songs))
    {
         foreach ($songs as $song) 
         {
           $songs .= "<li>$song</li>";
         }
    }else{
     echo "its not an array";
    }
$songList = "Songs: <ol> $songs </ol> 'r'n";
echo $songList;`  //output:  Songs: <ol> Array<li>a</li><li>b</li> </ol>