묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
[PHP] each함수와 foreach구문에 대한 질문이요.
2004.04.28 21:50
fgetcsv함수를 공부하던 중에 이상점이 발견되어 질문을 드려요.
fgetcsv함수가 만들어낸 배열을 each함수와 foreach구문의 인자로 사용하니까 에러가 발생하던데요.
원래 fgetcvs함수에서 만들어낸 배열은 each함수와 foreach구문의 인자로 사용할 수 없는건가요??
에러 내용은...
fgetcsv함수에서 만들어낸 배열을 foreach구문에 넣었을 때 나오는 에러...
Warning: Invalid argument supplied for foreach()
fgetcsv함수에서 만들어낸 배열을 each함수에 넣었을 때 나오는 에러...
Warning: Variable passed to each() is not an array or object
그리고 더욱 이상한 점은 동일한 내용을 메모장에 입력한 후에 각 문자열을 콤마(,)로 구분하여 txt 로 저장
한 파일을 fgetcsv함수를 이용하여 배열로 만들어 each함수와 foreach구문의 인자로 사용할 때는 에러가
발생하지 않는다는 겁니다.... 도데체 이유가 뭔지?? ㅡㅡ;;
제가 테스트한 소스는 다음과 같습니다.
--test.csv 파일내용-------------
동해물,백두산,마르고,닳도록
하느님,보우하사,우리나라,만세
무궁화,삼천리,화려강산,대한사람
-------------------------------
<each함수를 이용한 소스>
$fp=fopen("./test.csv","r+");
while(!feof($fp)){
$arr=fgetcsv($fp,10000,",");
while(list($key,$value)=each($arr)){
echo $value." ";
}
echo "<br>";
}
fclose($fp);
<foreach함수를 이용한 소스>
$fp=fopen("./test.csv","r+");
while(!feof($fp)){
$arr=fgetcsv($fp,10000,",");
foreach($arr as $value){
echo $value." ";
}
echo "<br>";
}
fclose($fp);
fgetcsv함수가 만들어낸 배열을 each함수와 foreach구문의 인자로 사용하니까 에러가 발생하던데요.
원래 fgetcvs함수에서 만들어낸 배열은 each함수와 foreach구문의 인자로 사용할 수 없는건가요??
에러 내용은...
fgetcsv함수에서 만들어낸 배열을 foreach구문에 넣었을 때 나오는 에러...
Warning: Invalid argument supplied for foreach()
fgetcsv함수에서 만들어낸 배열을 each함수에 넣었을 때 나오는 에러...
Warning: Variable passed to each() is not an array or object
그리고 더욱 이상한 점은 동일한 내용을 메모장에 입력한 후에 각 문자열을 콤마(,)로 구분하여 txt 로 저장
한 파일을 fgetcsv함수를 이용하여 배열로 만들어 each함수와 foreach구문의 인자로 사용할 때는 에러가
발생하지 않는다는 겁니다.... 도데체 이유가 뭔지?? ㅡㅡ;;
제가 테스트한 소스는 다음과 같습니다.
--test.csv 파일내용-------------
동해물,백두산,마르고,닳도록
하느님,보우하사,우리나라,만세
무궁화,삼천리,화려강산,대한사람
-------------------------------
<each함수를 이용한 소스>
$fp=fopen("./test.csv","r+");
while(!feof($fp)){
$arr=fgetcsv($fp,10000,",");
while(list($key,$value)=each($arr)){
echo $value." ";
}
echo "<br>";
}
fclose($fp);
<foreach함수를 이용한 소스>
$fp=fopen("./test.csv","r+");
while(!feof($fp)){
$arr=fgetcsv($fp,10000,",");
foreach($arr as $value){
echo $value." ";
}
echo "<br>";
}
fclose($fp);
댓글 4
-
써니루루☆
2004.04.28 22:44
-
김민규
2004.04.29 01:17
우선 답변 감사드려요.
그런데, 제가 테스트 할 때 배열의 크기가 1 이상이었거든요.
테스트한 파일 내용을 다시 올렸습니다. 다시 보시고 답변해 주셨으면 좋겠는데...^^;; -
써니루루☆
2004.04.29 02:13
// CSVTestData.dat 파일내용
동해물,백두산,마르고,닳도록
하느님,보우하사,우리나라,만세
무궁화,삼천리,화려강산,대한사람
<?php // List , Each
$fp=fopen("CSVTestData.dat","r");
while($arr=fgetcsv($fp,10000,",")){
while(list($key,$value)=each($arr)){
echo $value." ";
}
echo "<br>";
}
fclose($fp);
?>
<?php // Foreach
$fp=fopen("CSVTestData.dat","r");
while($arr=fgetcsv($fp,10000,",")){
foreach($arr as $value){
echo $value." ";
}
echo "<br>";
}
fclose($fp);
?>
두가지 전부 동일한결과로 나오는군요.
http://i-ruru.com/test/CSVTestListEach.php
http://i-ruru.com/test/CSVTestForEach.php -
김민규
2004.04.30 17:27
아~~ 이유를 알아냈습니다.
fgetcsv() 함수가 읽어들이는 파일 내용의 맨 마지막 줄이 Null로 끝날 경우, fgetcsv함수가 이 문
자열들을 읽어들여 배열로 만든 후에 foreach구문이나 each()함수의 인자로 사용하게 되면 에러가 발생하더군요.
맨 끝에 Null을 제거한 후에 테스트 해보니 정상적으로 출력되었습니다.
그래서 써니루루☆ 님 테스트 했을 경우에는 정상적으로 출력되고, 제가 테스트 했을 경우에는
에러가 발생했던 거네요...
써니루루☆님 답변 너무 감사드리고요. 그리고 계정에 직접 테스트 해주셔서 너무 감사드려요. (__)
배열의 사이즈가 1인건 아닌지 확인해보시고 foreach 구문 앞에 배열의 reset을 해보는건 어떨지 생각되는군요.