2013-10-26 70 views
0

我在我的HTML表单(方法 - 后)有以下多个选择元素。我想将$ songs数组转换为有序列表。PHP的foreach循环不起作用

<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转换为有序列表?

+0

的var_dump($歌曲);在foreach循环之前,让我们知道结果 –

+0

test_input()是否返回一个数组? – George

+0

你能显示你选择的HTML表单吗? –

回答

1

下面应该工作:

<?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> 

见:Multi-select to Array

+0

我更新了代码。仍然无法正常工作 – rkb

+0

@itsme查看帖子正文中的修改 –

0

这是因为您在循环时正在改变$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; 
+1

无关紧要。 'foreach'运行在数组的副本上,尽管这不是特别好的做法,但您可以在循环内更改变量而不会产生不利影响。 –

0

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>