2016-12-07 10 views
0

まず、私はPHPではかなり無責任なので、親切にしてください!私はSPCAのためのサイト(私は獣医とパートタイムオタクです)に取り組んでいます。 PHPはシェルターを管理し、画像、情報を保存するポータルからxmlファイルにアクセスします。このファイルはxmlデータをJSONに書き込んだ後、ハンドルバーテンプレートなどでJSONデータを使用します。xmlファイルからJSONにアウトプリントするデータを取得する際に問題が発生しています。 PHPファイルでXMLデータにアクセスするPHPのforeachステートメントの問題

</DataFeedAnimal>  
<AdditionalPhotoUrls> 
<string>doc_73737.jpg</string> 
<string>doc_74483.jpg</string> 
<string>doc_74484.jpg</string> 
</AdditionalPhotoUrls> 
<PrimaryPhotoUrl>19427.jpg</PrimaryPhotoUrl> 
<Sex>Male</Sex> 
<Type>Cat</Type> 
<YouTubeVideoUrls> 
<string>http://www.youtube.com/watch?v=6EMT2s4n6Xc</string>  
</YouTubeVideoUrls> 
</DataFeedAnimal> 

、コードは以下の通りです友人、、(それのほんの一部)によって書かれ、そのXMLデータにアクセスし、JSONに書き込み:

xmlファイルには、このようなものです:

<?php 

    $url = "http://eastbayspcapets.shelterbuddy.com/DataFeeds/AnimalsForAdoption.aspx"; 
if ($_GET["type"] == "found") { 
$url = "http://eastbayspcapets.shelterbuddy.com/DataFeeds/foundanimals.aspx"; 
} else if ($_GET["type"] == "lost") { 
$url = "http://eastbayspcapets.shelterbuddy.com/DataFeeds/lostanimals.aspx"; 
} 

$response_xml_data = file_get_contents($url); 
$xml = simplexml_load_string($response_xml_data); 
$data = array(); 

foreach($xml->DataFeedAnimal as $animal) 
{ 
$item = array(); 
$item['sex'] = (string)$animal->Sex; 
$item['photo'] = (string)$animal->PrimaryPhotoUrl; 
$item['videos'][] = (string)$animal->YouTubeVideoUrls; 
$item['photos'][] = (string)$animal->PrimaryPhotoUrl; 
foreach($animal->AdditionalPhotoUrls->string as $photo) { 
     $item['photos'][] = (string)$photo; 
    } 

$item['videos'] = array(); 
$data[] = $item; 
} 

echo file_put_contents('../adopt.json', json_encode($data)); 
echo json_encode($data); 
?> 

JSON出力は正常に機能しますが、「写真」のようにJSONファイルに書き込むための「ビデオ」を取得できません。私はちょうど '/ n'を得る!

これを手伝った友人はもはや周囲にいないので、私は立ち往生しています。私はforeachステートメントと同様のコードを写真用に​​試みましたが、どこにもいません。どんな助けも高く評価され、ペットもそれに感謝します。

答えて

1

このような実装では、ログファイルやコマンドラインにデータ構造をダンプすることで常に何を得ているのかを調べるという方法があります。次に、表示されるデータのドキュメントを見てみましょう。あなたが作業しているデータと作業方法を正確に知ることができます;-)

あなたが興味のあるビデオURLは、公共のプロパティを持つタイプSimpleXMLElementのオブジェクト内に配置されています。あなたがxml構造を見ると本当に驚くべきことではありません。クラスSimpleXMLElementのドキュメントには、すべての子を反復処理するメソッドchildren()が示されています。

foreach($animal->AdditionalPhotoUrls->children() as $photo) { 
    $item['photos'][] = (string)$photo; 
} 
foreach($animal->YouTubeVideoUrls->children() as $video) { 
    $item['videos'][] = (string)$video; 
} 

は、このフルおよび実施例を見てみましょう:私たちはそれらのセットにアクセスするには、きれいな実装では、これらの線に沿って行く必要があることを意味し...

を探しているだけで何

<?php 
$response_xml_data = <<< EOT 
<DataFeedAnimal> 
    <AdditionalPhotoUrls> 
    <string>doc_73737.jpg</string> 
    <string>doc_74483.jpg</string> 
    <string>doc_74484.jpg</string> 
    </AdditionalPhotoUrls> 
    <PrimaryPhotoUrl>19427.jpg</PrimaryPhotoUrl> 
    <Sex>Male</Sex> 
    <Type>Cat</Type> 
    <YouTubeVideoUrls> 
    <string>http://www.youtube.com/watch?v=6EMT2s4n6Xc</string> 
    <string>http://www.youtube.com/watch?v=hgfg83mKFnd</string> 
    </YouTubeVideoUrls> 
</DataFeedAnimal> 
EOT; 

$animal = simplexml_load_string($response_xml_data); 

$item = []; 
$item['sex'] = (string)$animal->Sex; 
$item['photo'] = (string)$animal->PrimaryPhotoUrl; 
$item['photos'][] = (string)$animal->PrimaryPhotoUrl; 
foreach($animal->AdditionalPhotoUrls->children() as $photo) { 
    $item['photos'][] = (string)$photo; 
} 
$item['videos'] = []; 
foreach($animal->YouTubeVideoUrls->children() as $video) { 
    $item['videos'][] = (string)$video; 
} 

echo json_encode($item); 

これの明白な出力は次のようになります。

{ 
    "sex":"Male", 
    "photo":"19427.jpg", 
    "photos" ["19427.jpg","doc_73737.jpg","doc_74483.jpg","doc_74484.jpg"], 
    "videos":["http:\/\/www.youtube.com\/watch?v=6EMT2s4n6Xc","http:\/\/www.youtube.com\/watch?v=hgfg83mKFnd"] 
} 

しかし、私は短いヒントを追加したいと思います:

m目では、このような構造化された情報を連想配列に変換することは疑問です。どうして?なぜ簡単なのですかjson_encode($animal)?構造は完全にうまくいて、使いやすいものにしてください!それの出力は次のようになります

構造は、 オブジェクト{...}によってJSONで囲まれ内部構造を有するアイテム)によってJSONで囲まれていないだけで任意 アレイ(構造無しセットを記述する
{ 
    "AdditionalPhotoUrls":{ 
    "string":[ 
     "doc_73737.jpg", 
     "doc_74483.jpg", 
     "doc_74484.jpg" 
    ] 
    }, 
    "PrimaryPhotoUrl":"19427.jpg", 
    "Sex":"Male", 
    "Type":"Cat", 
    "YouTubeVideoUrls":{ 
    "string":[ 
     "http:\/\/www.youtube.com\/watch?v=6EMT2s4n6Xc", 
     "http:\/\/www.youtube.com\/watch?v=hgfg83mKFnd" 
    ] 
    } 
} 

a [...])。配列は、そこにある2つの構造化されていない文字列のセット(写真とビデオ)でのみ使用されます。これは、一度それについて考えると、はるかに論理的です...

+0

ありがとう! 'json_encode($ animal)'の提案をお試しします。私は私の質問に答える時間を感謝します!うまくいく!私が取り組んでいるページはこのjsonデータを受け取り、採用するために利用可能な現在のペットをロードするためのハンドルバーテンプレートをプリコンパイルします。私はphpファイルで毎時cronジョブを実行してjsonデータを最新の状態に保ちます。ご興味がある場合はデモページへのリンクがあります。 [デモ](http://yourvets.com/docs/cardsJ.html) – Macsupport

+0

@Macsupport美しいウェブサイト、そこに疑問はありません。おめでとう!私はペットの動物を持っているという考えを賞賛していません。それに反対して、悲しい生物で満たされた動物の聖域を見るのは悲しいことです。非常に具体的な仕事や、遠くに住む人々のためには、確かに違いがあります。しかし、大多数の人々にとって、私は個人的には、その習慣を避けることが全体的に積極的な姿勢だと思っています。 – arkascha

0

XMLデータとJSONデータが同じ構造を持つことを前提としています。私はこれを見てみましょう:PHP convert XML to JSON

あなたはループを全く必要としないかもしれません。