PHP中返回的数据总是一个字符串吗?

时间:2015-02-05 11:55:39

标签: php arrays string curl

我使用下面的PHP函数获取数据 - 返回的数据总是一个字符串,还是一个数组呢?

function getData($xPostURL,$xToken,$xTokenSecret,$xAccount)
{ 
    $datatopost = array (
        "token" =>  $xToken,
        "tokenSecret" => $xTokenSecret,
        "account" => $xAccount,
    );

    $ch = curl_init ($xPostURL);
    curl_setopt ($ch, CURLOPT_POST, true);  
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $datatopost);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    $returnedData = curl_exec ($ch);

    echo $returnedData;
}

getData("http://www.example.com/foo.php","","","");

以下是通过print_r()返回foo.php数据的方式:

print_r($myArray);

数组如下所示:

Array
(
    [0] => hello
    [1] => world
    [2] => xyz
)

2 个答案:

答案 0 :(得分:2)

curl返回的数据始终是一个字符串。 HTTP专门用于文本,它不能传输任何其他内容。 curl不会将此文本解释为将其转换为其他任何内容。

答案 1 :(得分:1)

如果foo.php通过调用print_r()生成其输出,那么这就是另一个脚本(使用curl的脚本)得到的。即一个看起来像print_r()输出的字符串。

如果您希望foo.php返回一个数组,那么您需要更改foo.php以将此数组表示为字符串并输出该字符串然后在客户端代码中解析数组的字符串表示以重构内存中的数组。

PHP中有很多方法可以生成数据结构的字符串表示形式。 JSON是最好的(在我看来),也可以使用XML,内部PHP序列化也可以工作(它是唯一一个可以存储和重新创建嵌入递归引用的对象),var_export()也可以这样做。

快速清单:

  • JSON :使用json_encode()foo.php中的数据进行编码;使用json_decode()分析字符串(由curl_exec()返回)并在另一端重新创建数据结构;将TRUE作为第二个参数传递给json_decode()以获取数组,否则它将生成一个PHP object

    优势[+]和劣势[-]

    • [+]它是标准表示,其他编程语言(直接由语言或其某些库)非常好理解;
    • [+]它产生最短的文本表示;
    • [+]编码和解码非常简单:两者都需要一次调用正确的函数;
    • [+]这也是编码和解码方面最快的方法;
  • XML :使用SimpleXML类和函数创建XML对象,然后迭代地向其添加数据。调用方法SimpleXMLElement::asXML()以创建XML的文本表示并输出它。然后使用simplexml_load_string()或类SimpleXML的无数方法从中提取数据。

    • [+] XML格式是标准化的,非常受欢迎,并且受到许多其他编程语言的支持;
    • [+]它可用于传输大型数据结构;
    • [+]解析可以递增完成,只提取所需的数据;没有必要在内存中重新创建整个结构;
    • [-]编码和解码都需要大量代码;
    • [-]文字表示很大;对于包含小字符串的数据结构,它通常比等效JSON;
    • 大2倍
    • [-]编码和解码时代码的速度也很差(这是本文介绍的最差方法);
  • PHP 序列化:使用PHP函数serialize()将数据结构表示为字符串;使用函数unserialize()来解析字符串并重新创建PHP数据结构。

    • [+]文字表示的长度不是很大;它略大于JSON但不是很大;
    • [+]它可以处理(编码和解码)包含循环引用的数据结构(其他方法不能这样做);
    • [+]它可以处理对象(OOP);在重建时,它需要知道文本中使用的类的定义或加载它们的方法;
    • [+]编码和解码的速度略差于json_encode() / json_decode(),但不显着;
    • [-]它是PHP的内部表示。没有其他语言可以理解它的现成品;一个人需要编写一个解析器来分析文本表示并恢复数据结构(但这很简单,格式很简单)。
  • http_build_query():这只能用于包含标量值的数组。使用函数http_build_query()生成输入数据(数组)的字符串表示形式。使用函数parse_str()来解析字符串并重新创建原始数组。

    • [+] http_build_query()生成的字符串是一个URL编码的查询字符串,它是在网页之间传递数据的标准方式。它可以使用用于Web开发的语言以及其他语言轻松解码;
    • [+]它会生成最短的文本表示,因为它不会对值的类型进行编码...
    • [-] ...但这会强制重新创建的数组中的值为字符串;没有办法恢复原始类型(因为它们在编码时丢失);
  • var_export():PHP函数var_export()生成可用于在内存中生成数据结构的PHP代码;可以通过运行该代码来完成数据结构的重建。

    [+]输出正确的PHP代码;它可以很容易地被人类检查和修改; [+]数据恢复可能是此处介绍的所有方法中最快的,但风险(见下文)与增益不匹配(无论如何都是无关紧要的); [-]因为重建是通过运行或评估PHP代码来完成的,所以它可以代表运行它的代码执行任何操作; 从另一台服务器下载的[-]运行代码是一个非常严重的安全问题;即使您控制其他服务器,恶意黑客也可以使用不同的技术将您的请求转移到他们控制的服务器上,或者将一些额外的代码附加到另一台服务器生成的代码中;黑客生成的代码将在您的服务器上执行,从那时起您的服务器就不再是您的服务器了; 从不自动运行从其他服务器下载的代码!

结论

有许多方法可以将数据结构从一台运行在服务器上的脚本传输到另一台运行在另一台服务器上的脚本。最好的(在我看来)是JSON,然后是XML。它们具有便携性和其他语言良好支持的优点。 JSON速度快,体积小,易于使用。 XML更难以使用,但这是因为它非常灵活,可以通过多种方式进行处理。

如果您不需要与不运行PHP并且JSON无法帮助您的系统交换数据,那么PHP序列化也是JSON的一个很好的替代方案。

此处描述的其他选项仅用于教育目的。

从不自动运行或评估从其他网站下载的代码。