2011-07-22 12 views
8

は私のコードです:SimpleXMLで配列を配列の最初の要素に変更するのはなぜですか?ここ

$string = <<<XML 
<?xml version='1.0'?> 
<test> 
<testing> 
    <lol>hello</lol> 
    <lol>there</lol> 
</testing> 
</test> 
XML; 
$xml = simplexml_load_string($string); 
echo "All of the XML:\n"; 
print_r $xml; 
echo "\n\nJust the 'lol' array:"; 
print_r $xml->testing->lol; 

出力:

All of the XML: 

SimpleXMLElement Object 
(
    [testing] => SimpleXMLElement Object 
     (
      [lol] => Array 
       (
        [0] => hello 
        [1] => there 
       ) 

     ) 

) 




Just the 'lol' array: 

SimpleXMLElement Object 
(
    [0] => hello 
) 

なぜそれが唯一の出力[0]の代わりに配列全体のでしょうか?理解できません。

答えて

5

あなたには2つの要素があるからです。第二にアクセスするためには、これを実行する必要があります。

$xml->testing->lol[1]; 

これは「そこ」

$xml->testing->lol[0]; 

は「ハロー」

子供(あなたを与えるだろうあなたを与えるだろう)の方法をSimpleXMLElementはあなたに例えば要素のすべての子を含むオブジェクトを与える:

$xml->testing->children(); 

はあなたを与えるだろう"テスト" SimpleXMLElementのすべての子を含むオブジェクトです。

あなたが反復する必要がある場合は、次のコードを使用することができます。

http://www.php.net/manual/en/class.simplexmlelement.php

+0

これは問題の解決に役立ちましたか? –

+1

@ Yattatronこれは質問の「なぜ」に全く答えません。 '$ lol [1]' = "there"と '$ lol [0]' = "hello"なので、 'print_r($ lol)'は '0 => 'hello' 1 => "there" '?? – chiliNUT

+0

@chiliNUTあなたは非常に有効なポイントを持っています。私は思って、私の答えをちょっと修正するつもりです。 –

6

何@Yottatronが提案することは事実であるが、ない:

foreach($xml->testing->children() as $ele) 
{ 
    var_dump($ele); 
} 

をここにSimpleXMLElementに関する詳細情報はありこの例のようにすべての場合で

XMLが次のような場合:

<?xml version='1.0'?> 
<testing> 
    <lol> 
     <lolelem>Lol1</lolelem> 
     <lolelem>Lol2</lolelem> 
     <notlol>NotLol1</lolelem> 
     <notlol>NotLol1</lolelem> 
    </lol> 
</testing> 

のSimpleXMLの出力は次のようになります。

SimpleXMLElement Object 
(
[lol] => SimpleXMLElement Object 
    (
     [lolelem] => Array 
      (
       [0] => Lol1 
       [1] => Lol2 
      ) 

     [notlol] => Array 
      (
       [0] => NotLol1 
       [1] => NotLol1 
      ) 

    ) 

) 

とを

$xml->lol->lolelem 

を書き込むことによって、あなたの結果は

Array 
(
    [0] => Lol1 
    [1] => Lol2 
) 

ではなく、それを、あなたが希望することを期待したいです取得:

0この結果を与える

$xml->xpath("//lol/lolelem") 

(ない:

SimpleXMLElement Object 
(
    [0] => Lol1 
) 

$xml->lol->children() 

であなたが得るでしょう:

SimpleXMLElement Object 
(
[lolelem] => Array 
    (
     [0] => Lol1 
     [1] => Lol2 
    ) 

[notlol] => Array 
    (
     [0] => NotLol1 
     [1] => NotLol1 
    ) 

) 

あなたがする必要がどのようなあなただけlolelemのをしたい場合予想される形状であるが、正しい要素を含む)

Array 
(
    [0] => SimpleXMLElement Object 
    (
     [0] => Lol1 
    ) 

    [1] => SimpleXMLElement Object 
    (
     [0] => Lol2 
    ) 

) 
0

あなたはループのためのシンプルで同じ効果を得ることができるように

XPathは、少し遅くなることがあります...この問題に遭遇しました。あなたの代わりに使用するので呼び出すことができる真の引数で

何をやりたいかもしれませんが、JSONのエンコード/デコードに

$jsonArray = Json_decode(Json_encode($xml), true); 

を使用している

for ($i = 0; $i < count($xml->testing->lol); $i++) { 
    print_r($xml->testing->lol[$i]); 
} 
1

- > [名]

ので、例を使用次のようになります。

$xml = file("someXmlFile.xml"); 
$jsonArray = Json_decode(Json_encode($xml), true); 
foreach(jsonArray['title'] as $title){ 
    Do something with $titles 
} 

あなたは1つの以上の要素を持っている場合、それは要素ヘクタール場合@attributesにおける典型的な配置しますsの属性。これは以下を使用して対抗することができます:$title = $title['@attributes']

希望します。

1

ああ、私は単純に、この構文解析配列の問題で頭を悩ましているのを覚えています。 以下のコードを試してみてください。それはあなたにLOL要素の配列を与えるでしょう。もしあなたがただ一つのLOL要素を持っていれば、それも同様に配列に返します。

主な利点は、foreach($ lolは$ element)のようなことができ、LOL要素が1つ(または0)のLOL要素でも機能することです。

<?php 
$string = <<<XML 
<?xml version='1.0'?> 
    <test> 
    <testing> 
     <lol>hello</lol> 
     <lol>there</lol> 
    </testing> 
    </test> 
XML; 

$xml = simplexml_load_string($string); 
echo "<pre>"; 
echo "All of the XML:\n"; 
print_r($xml); 

echo "\n\nJust the 'lol' array:\n"; 

$test_lols = $xml->testing->children();    
$childcount = count($test_lols); 
if ($childcount < 2) { 
    $lol = array($test_lols->lol);     
} 
else { 
    $lol = (array) $test_lols; 
    $lol = $lol['lol']; 
    } 

print_r($lol); 
?> 
関連する問題