循环遍历php中的.NET Web服务调用的结果

时间:2012-03-16 17:44:14

标签: php asp.net web-services wsdl

我正在尝试使用返回通用列表的方法从.net Web服务获取结果。在php页面中使用var_dump(使用WSDL调用.net方法),我能够看到从.net Web服务返回以下内容:

object(stdClass)#4 (1) { 
    ["testClass"]=> array(2) { 
        [0]=> object(stdClass)#5 (2) { 
            ["City"]=> string(7) "Hello_1" 
            ["State"]=> string(8) "World!_1" 
        } 
        [1]=> object(stdClass)#6 (2) { 
            ["City"]=> string(7) "Hello_2" 
            ["State"]=> string(8) "World!_2" 
        } 
    }
} 

这可能是一个愚蠢的问题,但我陷入了处理(循环)这个结果在PHP?我是否还必须在php中创建“testClass”类?

这是.net网络服务代码

public class testClass
    {
        public string City;
        public string State;
    }

[WebMethod]
public List<testClass> testAspMethod(string Param1, string Param2) 
{
    List<testClass> l = new List<testClass>();

    l.Add(new testClass { City = Param1 + "_1", State = Param2 + "_1" });
    l.Add(new testClass { City = Param1 + "_2", State = Param2 + "_2" });

    return l;
}

这是调用此.net Web服务的PHP代码

$ client = new SoapClient(“http://testURL/MyTestService.asmx?WSDL”);

$params->Param1 = 'Hello'; 
$params->Param2 = 'World!';

$result = $client->testAspMethod($params)->testAspMethodResult;

var_dump($result);

如何在php中循环结果?

2 个答案:

答案 0 :(得分:2)

无论返回的项目数量如何,这都将有效。如果你没有像我这里那样进行数组检查,那么你的代码会产生意想不到的结果。如果webservice仅返回单个项目,则它不会返回数组。相反,它实际上会将对象直接放在$result->testClass中,例如正如您所料,$result->testClass->City不是$result->testClass[0]->City

// here we make sure we have an array, even if there's just one item in it
if(is_array($result->testClass))
{
    $result = $result->testClass;
}
else
{
    $result = array($result->testClass);
}

foreach($result as $item)
{
    echo 'City: ' . $item->City . '<br />';
    echo 'State: ' . $item->State . '<br />';
}

答案 1 :(得分:1)

如果您知道要返回的名称(在本例中为testClass),您可以...

foreach($result->testClass as $key => $obj){
    echo "Key: $key\n";
    echo $obj->City . "\n";
    echo $obj->State . "\n";
}