2013-10-26 4 views
0

내 html 양식 (메소드 - 게시)에 여러 개의 select 요소가 있습니다. 정렬 된 목록으로 변환하려면 $ 노래 배열을 변환하고 싶습니다.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()

누군가가 기능 test_input 만약이 foreach() 루프


잘못 무슨 일이 일어나고 있는지 알려주세요()는 01 대신 String을 반환합니다.그러면 $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> 
관련 문제