我试图在 PHP 函数中返回一个关联数组。该函数从 MySQL 中检索一些数据,并使用 Zend Library 发布在 WebService 中。
这个函数看起来像:
函数.php
class Functions
{
/**
*
* @return array
*/
public function Function1()
{
$con = new mysqli(server, user, pass, database);
if ($con->connect_errno) {
die(__FUNCTION__ . $con->connect_error);
}
$con->set_charset('utf8');
$arrayRet = array();
$query = 'select field1, field2, field3 from table1';
if(!$result = $con->query($query)){
die(__FUNCTION__ . $con->error);
}
while( $row = $result->fetch_array(MYSQLI_ASSOC) )
$arrayRet[] = $row;
$result->close();
$con->close();
return $arrayRet;
}
}
然后我有另一个 PHP 文件,它允许我通过 SOAP 访问该函数(使用 Zend Lib):
服务器.php
<?php
include 'Zend/Soap/AutoDiscover.php';
include 'Zend/Soap/Server.php';
include 'Functions.php';
if(isset($_GET['wsdl']))
{
$autodiscover = new Zend_Soap_AutoDiscover();
$autodiscover->setClass('Functions');
$autodiscover->handle();
}
else
{
$server = new Zend_Soap_Server("http://localhost/webservice/Server.php?wsdl");
$server->setClass('Functions');
$server->handle();
}
?>
到目前为止,一切看起来都很正常。如果我编写一个 php 客户端,我可以使用 web 服务并访问返回的数组,如下所示:
<?php
$client = new Zend_Soap_Client('http://localhost/webservice/Server.php?wsdl');
$arrayRet = $client->Function1();
foreach($arrayRet as $row )
{
?>
<b>Field1: </b><?php echo $row['field1']; ?><br>
<b>Field2: </b><?php echo $row['field2']; ?><br>
<b>Field3: </b><?php echo $row['field3']; ?><br>
<?php
}
?>
好的,现在我的问题是我不是在写一个 php 客户端,而是一个 Android 客户端。我正在使用 ksoap2 库来实现它。有了这个库,我可以按照这个算法处理带有键和值的“普通数组” 。使用他的属性:
SoapObject category_list = (SoapObject) property;
String key = category_list.getProperty("key").toString();
String value = category_list.getProperty("value").toString();
但是上面函数的响应(如果我复制 toString() 结果)看起来像:
Function1Response
{
return=
[
Map{
item=anyType{key=field1; value=hello; };
item=anyType{key=field2; value=web; };
item=anyType{key=field3; value=service; };},
Map{
item=anyType{key=field1; value=hello2; };
item=anyType{key=field2; value=web2; };
item=anyType{key=field3; value=service2; };},
Map{
item=anyType{key=field1; value=hello3; };
item=anyType{key=field2; value=web3; };
item=anyType{key=field3; value=service3; };}
];
}
我可以使用 key 和 value 属性来迭代这个响应,但我认为如果我能有这样的响应会更好(和高效):
Function1Response
{
return=
[
Map{
item=anyType{field1=hello; };
item=anyType{field2=web; };
item=anyType{field3=service; };},
Map{
item=anyType{field1=hello2; };
item=anyType{field2=web2; };
item=anyTypefield3=service2; };},
Map{
item=anyType{field1=hello3; };
item=anyType{field2=web3; };
item=anyType{field3=service3; };}
];
}
所以我可以像这样检索它们:
SoapObject category_list = (SoapObject) property;
String field1 = category_list.getProperty("field1").toString();
String field2 = category_list.getProperty("field2").toString();
String field3 = category_list.getProperty("field3").toString();
那可能吗?我认为它可以在 php 服务器端以某种方式完成。但我不知道。我一直在这里和那里阅读,但似乎没有人有这个问题..或解决方案。
我很抱歉发了这么长的帖子。如果我不够清楚,我可以提供更多代码细节或更好地解释它。
感谢您的帮助!