PHP 関数で連想配列を返そうとしています。この関数は、MySQL から一部のデータを取得し、Zend ライブラリを使用して 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;
}
}
次に、(Zend Lib を使用して) SOAP 経由で関数にアクセスできるようにする別の PHP ファイルがあります。
サーバー.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; };}
];
}
キーと値のプロパティを使用してこの応答を繰り返すこともできますが、次のような応答があれば、はるかに優れた (そして効率的な) ものになると思います。
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サーバー側で何とかできると思います。しかし、私にはわかりません。私はあちこちで読んでいますが、誰もこの問題を抱えていないようです..または解決策.
長い投稿で申し訳ありません。十分に明確でない場合は、コードの詳細を提供したり、より適切に説明したりできます。
助けてくれてありがとう!