6

私はここで本当に明白な何かが欠けていると思いますが、誰かが私が次のvarダンプで期待する出力ではなく、私が出力を取得している理由を説明できますか?

元のxmlは次のとおりです。

<result>
    <category>
        <id>3</id>
        <name>Category 1</name>
        <subcategory>
            <id>9</id>
            <name>SubCat 1</name>
        </subcategory>
        <subcategory>
            <id>10</id>
            <name>SubCat 2</name>
        </subcategory>
        <subcategory>
            <id>11</id>
            <name>SubCat 3</name>
        </subcategory>
    </category>
</result>

私がしていること:

$xml = new SimpleXMLElement($file);
foreach($xml->category as $node)
{
    echo "dump 1:
";
    var_dump($node);
    echo "**********************************************
dump 2:
";
    var_dump($node->subcategory);
    die();
}

これは以下を出力します:

dump 1:
object(SimpleXMLElement)#130 (3) {
    ["id"]=>
    string(1) "3"
    ["name"]=>
    string(10) "Category 1"
    ["subcategory"]=>
    array(3) {
        [0]=>
        object(SimpleXMLElement)#133 (2) {
            ["id"]=>
            string(1) "9"
            ["name"]=>
            string(8) "SubCat 1"
        }
        [1]=>
        object(SimpleXMLElement)#135 (2) {
            ["id"]=>
            string(2) "10"
            ["name"]=>
            string(8) "SubCat 2"
        }
        [2]=>
        object(SimpleXMLElement)#136 (2) {
            ["id"]=>
            string(2) "11"
            ["name"]=>
            string(8) "SubCat 3"
        }
    }
}
**********************************************
dump 2:
object(SimpleXMLElement)#138 (2) {
    ["id"]=>
    string(1) "9"
    ["name"]=>
    string(8) "SubCat 1"
}

最初のvardumpは私が期待するものを出力しますが、2番目のvar_dumpに期待する出力は次のようになります。

array(3) {
    [0]=>
    object(SimpleXMLElement)#133 (2) {
        ["id"]=>
        string(1) "9"
        ["name"]=>
        string(8) "SubCat 1"
    }
    [1]=>
    object(SimpleXMLElement)#135 (2) {
        ["id"]=>
        string(2) "10"
        ["name"]=>
        string(8) "SubCat 2"
    }
    [2]=>
    object(SimpleXMLElement)#136 (2) {
        ["id"]=>
        string(2) "11"
        ["name"]=>
        string(8) "SubCat 3"
    }
}

または、すべての配列項目を含むオブジェクトですら。なぜそうではないのですか?

見つかった最初の「サブカテゴリ」ノードをダンプしていると呼び出すvar_dump($node->subcategory)とわかりますが、なぜ最初の変数ダンプの配列にすべての「サブカテゴリ」ノードをキャストしますが、2番目のノードはキャストしませんか?そして、この動作を模倣して、「サブカテゴリ」に複数のオブジェクトが含まれているかどうかを検出するにはどうすればよいですか(最初のvarダンプの場合と同様)。

基本的に私がやろうとしているのは、SimpleXMLElementのプロパティにさらに多くの値の配列が含まれているかどうかを検出することです(つまり、子ノードが含まれている場合)

すべての種類を試しましたが、simpleXmlオブジェクトのプロパティの1つに配列のセットが含まれているかどうかを検出できないようです。

アップデート:

私はこれがうまくいくことを発見しました:

if(count($node->subcategory)>1)
{
    // we have  more than one subcategory
}

しかし、それは最もエレガントな方法ではありません、私はよりクリーンな方法があるに違いないと確信していますか?

4

2 に答える 2

1

このプロパティは反復子のオブジェクトです:

$node->subcategory

そして、すべてのアイテムを入手する必要がある場合は、次を試してください。

foreach($xml->category as $node)
{
...
  foreach($node->subcategory as $subcategory)
  {
     $data[] = (array) $subcategory
  }
...
}

サブカテゴリアイテムの数を知る必要がある場合は、count-methodを正常に使用しました。

また、XMLツリーを変更しない場合は、xpathを使用できます。

$categories = $xml->xpath('/category/subcategory');
var_dump($categories)
于 2012-10-03T15:09:32.987 に答える
1

xmlファイルを調整します。

<result>
    <category>
        <id>3</id>
        <name>Category 1</name>
        <subcategories>
          <subcategory>
            <id>9</id>
            <name>SubCat 1</name>
          </subcategory>
          <subcategory>
            <id>10</id>
            <name>SubCat 2</name>
          </subcategory>
          <subcategory>
            <id>11</id>
            <name>SubCat 3</name>
          </subcategory>
        </subcategories>
    </category>
</result>

そして試してみてください:

var_dump($node->subcategories);
于 2012-10-03T15:15:57.333 に答える