2

私が気付いたのは、AWS PHP SDKからの応答が単一の結果である場合もあれば、結果の配列である場合もあるということです。

この問題は、CFSimpleXML/SimpleXML オブジェクトを扱う際の知識不足が原因である可能性があります。

私はこれを行ういくつかの方法を試しましたが、どれもかなり難しいものでした。

何が起こっていますか

describe_load_balancers を使用した呼び出しの例

<?php

$elb      = new AmazonELB();
$response = $elb->describe_load_balancers();

if ($response->isOK())
{
    foreach($response->body->LoadBalancerDescriptions() AS $loadBalancer)
    {
        print_r($loadBalancer);
    }
}
?>

結果が 1 つしかない場合は、次のように出力されます。

CFSimpleXML Object
(
    [member] => CFSimpleXML Object
        (
            [SecurityGroups] => CFSimpleXML Object
                (
                )

            [LoadBalancerName] => LBName1
            [CreatedTime] => 2012-08-01T12:22:03.910Z
            ...
        )
)

複数の結果がある場合は、次のように出力されます。

CFSimpleXML Object
(
    [member] => Array
        (
            [0] => CFSimpleXML Object
                (
                    [SecurityGroups] => CFSimpleXML Object
                        (
                        )

                    [LoadBalancerName] => LBName1
                    [CreatedTime] => 2012-08-01T12:22:03.910Z
                    ...
                )

            [1] => CFSimpleXML Object
                (
                    [SecurityGroups] => CFSimpleXML Object
                        (
                        )

                    [LoadBalancerName] => LBName2
                    [CreatedTime] => 2012-08-01T16:17:21.030Z
                    ...
                )
        )
)

単一の結果がある場合に欲しいもの

CFSimpleXML Object
(
    [member] => Array
        (
            [0] => CFSimpleXML Object
                (
                    [SecurityGroups] => CFSimpleXML Object
                        (
                        )

                    [LoadBalancerName] => LBName1
                    [CreatedTime] => 2012-08-01T12:22:03.910Z
                    ...
                )
        )
)

ループしてmember配列かどうかを確認しようとしましたが、それでも CFSimpleXML オブジェクトとして返されるため、print_rそこにあるという配列を検出できませんでした。

リストを反復処理して、コード内で SimpleXML から ELB のモデルを作成するか、属性を簡単に反復処理できるようにしたいと考えています。

4

2 に答える 2

2
$elb      = new AmazonELB();
$response = $elb->describe_load_balancers();

foreach($response->body->LoadBalancerDescriptions() AS $item)
{
    foreach($item->member() AS $member)
    {
        print_r($member);
    }
}

版画

CFSimpleXML Object
(
[SecurityGroups] => CFSimpleXML Object
    (
    )

[LoadBalancerName] => LBName1
[CreatedTime] => 2012-08-01T12:22:03.910Z

2012 年 9 月 14 日編集: 簡単な更新を行い、私が見つけた役立つリンクを共有したかっただけです: Konrad Kiss' Code & Tech Rant: Listing AWS instances in PHP

于 2012-08-01T17:06:22.170 に答える
0

$response->body の to_json、to_stdClass、to_array メソッドを利用できます

<?php

require_once 'AWSSDKforPHP/sdk.class.php';

$ec2 = new AmazonEC2();

$response = $ec2->describe_instances(); 
$instances = $response->body->to_stdClass();

echo count($instances->reservationSet->item).PHP_EOL;

foreach ($instances->reservationSet->item as $reservation) {
    echo $reservation->instancesSet->item->instanceId.PHP_EOL; 
}

これについては、すでにここで説明しました: SimpleXML オブジェクト PHP の反復処理

于 2012-10-22T03:31:04.807 に答える