2010-12-29 9 views
2

아래 코드가 있습니다. 문자열의 첫 번째 문자 만 반환합니다. 내가 var_dump($row);를 사용하는 경우PHP foreach 루프는 각 문자열의 첫 번째 문자 만 반환합니다.

$conn = Mage::getSingleton('core/resource')->getConnection('connection_write'); 
$str = 'something to search for'; 
$fields = 'content_field1, content_field2, content_field3, content_field4'; 
$idFields = 'id_field1, id_field2, id_field3, id_field4'; 
$tables = 'table1, table2, table3, table4'; 
$table = explode(', ', $tables); 
$field = explode(', ', $fields); 
$rowId = explode(', ', $idFields); 

$i=1; 
while ($i<4) { 
    $f = $field[$i]; 
    $id = $rowId[$i]; 
    $sql = $conn->select()->from($table[$i], array($f, $id))->where($f . " LIKE ?", '%' . $str . '%'); 
    $result = $conn->fetchRow($sql); 

    foreach ($result as $row) { 
    var_dump($row[$id]); 
    } 

    $i++; 
} 

그러나, ID 필드와 콘텐츠 분야 모두에서 전체 문자열이 출력된다.

누구나 내가 잘못하고있는 것을 설명 할 수 있습니까?

미리 감사드립니다.

+0

문자열은 문자 배열로 간주되므로'$ test = "abcs"'는'$ test = array ('a', ' $ test [2]'는'c'를 char의 배열에서 세 번째 인덱스로 표시합니다! – RobertPitt

+0

@RobertPitt : 아날로그 "string == array"는 요소에 액세스하는 경우에만 true입니다. 다른 경우에는 문자열과 배열이 다르게 동작합니다. – zerkms

+0

예 그들은 다르게 행동합니다. 내가 생각하는 방식은 Strings hae ArrayAccess가 구현 한 것입니다! – RobertPitt

답변

0

그러나 var_dump ($ row)를 사용하면; id 필드와 content 필드의 전체 문자열이 출력됩니다.

글쎄 왜 var_dump($row[$id]);은 "$ row 문자열에서 $ id'th char를 가져 오는 것과 정확히 똑같습니까?"

+0

내가 얻으려고하는 것은 결과에서 id 필드를 분리하는 것입니다. – Jack

+0

@Jack :'var_dump ($ result);'거기에 키'id'가 있습니까? 그렇다면 - 루프 대신에'$ result [ 'id']'를 사용하십시오. – zerkms

0
foreach ($result as $row) { 

$ result는 테이블에서 선택한 행의 목록입니다. 각 $ 행은 문자열입니다. $ row [$ id]는이 행 문자열에서 $ id '번째 문자를 선택하기 만합니다.

0

나는이 결과가 $ result가 문자열의 배열 (가능하면 연관 배열)이라는 사실과 관련이 있다고 생각한다. (저는 Mage에 익숙하지 않지만, fetchRow()는 모든 행이 아닌 하나의 행만 리턴한다고 가정합니다.)

따라서 다음과 같은 결과가 나옵니다.

$result = array("tom","dick","harry"); 

foreach($result as $row)을 실행하면 $ row는 각 반복마다 "tom", "dick"및 "harry"처럼 보입니다.

$ row가 문자열이기 때문에 $row[$id]을 호출하면 PHP가 $ 행 문자열에서 단일 문자를 가져 오려고 시도합니다. 이 경우 $ id가 정수가 될 것으로 예상하기 때문에 "id_field1"을 0으로 해석하면 문자열의 첫 번째 문자가 반환됩니다.

내가 좋아하는 무언가로 다시 얻기 위해 노력하고 정확히 모르겠지만, 대부분이이 당신의 foreach는 섹션을 변경하여 해결할 수 있습니다 ...

foreach ($result as $resultColumn) { 
    var_dump($resultColumn); 
} 
0

-> 페치() 코드에서와 같이 foreach 문을 사용하여 데이터를 가져올 때 필요하지 않습니다 (아래 예제 참조). 불필요하게 -> fetch()를 사용하면이 상황이 자주 발생합니다 (나는 이것을 경험했습니다.)

foreach 문과 while 문은 다음과 같은 관계가 있습니다.

<?php 
$stmt = $pdo->query('SELECT * FROM Entry'); 

while ($row = $stmt->fetch()) { 
    echo $row['title'], $row['content']; 
} 
//this while statement above is equivalent to the foreach statement below 

foreach ($stmt as $row) { 
//->fetch() is not needed for foreach statement! 
    echo $row['title'], $row['content']; 
} 
관련 문제