2010-04-20 5 views
2

:PHP는 :이 코드를 실행하면 SimpleXML을 및 배열이

foreach($xml->movie as $movie) { 
    if(isset($movie->photos)) { 
     foreach ($movie->photos as $photo) { 
      echo $photo." "; 
     } 
     echo "<hr/>"; 
    } 
} 

을 내가 실제 데이터의 좋은 출력을 얻을, 예를 들어, 행 보이는 같은

06397001.jpg 06397002.jpg 06397003.jpg 06397004.jpg 06397005.jpg

하지만 배열을 던질 때, 모든 SimpleXML을 래퍼 태그와 JPG를을 포함 배열의 루트에 있지 않습니다.

코드 :

foreach($xml->movie as $movie) { 
    if(isset($movie->photos)) { 
     $photos = array(); 
      foreach ($movie->photos as $photo) { 
       $photos[] = $photo; 
      } 
    } else $photos = ""; 
    var_dump($photos); 
    echo "<hr />"; 
} 

예를 들어, 같은 행은

array(5) { 
    [0]=> object(SimpleXMLElement)#11 (1) { 
     [0]=> string(12) "06397001.jpg" 
    } 
    [1]=> object(SimpleXMLElement)#12 (1) { 
     [0]=> string(12) "06397002.jpg" 
    } 
    [2]=> object(SimpleXMLElement)#13 (1) { 
     [0]=> string(12) "06397003.jpg" 
    } 
    [3]=> object(SimpleXMLElement)#14 (1) { 
     [0]=> string(12) "06397004.jpg" 
    } 
    [4]=> object(SimpleXMLElement)#15 (1) { 
     [0]=> string(12) "06397005.jpg" 
    } 
} 

처럼 보인다 왜 이런 일이/어떻게 그렇게이를 제거 할 수 있습니다 난 그냥 그것을 에코 때와 같은 루트 수준의 사진의 배열을 얻을?

답변

4

SimpleXMLElement 결과는 단순한 개체 및 배열처럼 보이지만 일반적인 개체 및 배열에서는 수행 할 수없는 마술 같은 것들을 수행합니다. 이렇게하면 코드를 적게 사용할 수 있습니다.

foreach($xml->movie as $movie) { 
    if(isset($movie->photos)) { 
    $photos = array(); 
    foreach ($movie->photos as $photo) { 
     $photos[] = "$photo"; 
     // or you could use, I believe: $photos[] = $photo[0] 
    } 
    } 
    else $photos = ""; 
    var_dump($photos); echo "<hr />"; 
} 

왜 이런 일이 :

당신은 아마 같은 것을 사용하여 문제를 해결할 수 있습니까? SimpleXML 요소는 문자열로 처리 될 때 해당 요소의 텍스트 내용이되는 값으로 문자열처럼 동작합니다. 첫 번째 예제에서 echo는 요소를 문자열로 처리하여 문자열을 반환했습니다.

+1

완벽한 필요가 누군가 도움이되기를 바랍니다 - 위대한 설명 감사합니다! – acemasta

+0

그 때 그것은 작동 한 ㄴ다는 것을 나는 신뢰 하는가? – thomasrutter

+0

나는 이것도 궁금해했다, 정보를위한 감사합니다! – mdgrech

0

나는이 질문이 오래된 veeery이고 이미 답변을 받았지만 오늘이 이슈가 있었기 때문에 반복적 인 톤을 포함하지 않는 상대적으로 더 좋고 단순한 솔루션을 발견 했으므로 나는 그것을 여러분과 공유하고 싶습니다. .

먼저 xml 구조를 염두에두고 영화 정보가 필요 없다는 사실을 알고 싶으면 반복 할 필요는 없지만 모든 사진을 모으기 위해서는 xpath를 통해서만 수행 할 수 있습니다. 즉

당신이있는 경우

여러 영화

$photos = $xml->xpath('//movie//photos'); // double slash means get all elements with that tag name. 

는 모든 영화에서 모든 사진을 얻을. 이 코드는 키 [0]과 이미지 이름의 값을 가진 배열 인 SimpleXMLElements의 배열을 제공합니다. 단순히 이미지를 문자열로 가져 오기 위해 반복하지 않고 이미지 이름을 얻으려면 해당 요소를 문자열로 단순히 캐스팅하면 SimpleXMLElement 대신 문자열로 출력됩니다! 당신이 지금해야 할 수도 있습니다

유일한 루프는 다음과 같습니다

foreach($photos as $photo) { 
    dump((string) $photo); // this will output the image name as a string e.g. "06397002.jpg" 
} 

건배, 나는 그것을