【问题标题】:Looping/Iterating through AWS PHP SDK response通过 AWS PHP SDK 响应循环/迭代
【发布时间】:2012-08-01 17:01:36
【问题描述】:

我注意到来自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);
    }
}
?>

如果它只有一个结果,它会打印如下内容:

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 模型,或者轻松地遍历属性。

【问题讨论】:

    标签: php sdk amazon-web-services simplexml


    【解决方案1】:
    $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

    【讨论】:

      【解决方案2】:

      您可以利用 $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; 
      }
      

      这里已经讨论过了:iterating over SimpleXML Objext PHP

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-08
        • 2013-01-14
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        相关资源
        最近更新 更多