2013-10-26 69 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>