【问题标题】:Is a returned data in PHP always a string?PHP中返回的数据总是一个字符串吗?
【发布时间】:2015-02-05 11:55:39
【问题描述】:

我正在使用下面的 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","","","");

下面是foo.php 数据是如何通过 print_r() 返回的:

print_r($myArray);

数组如下所示:

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

【问题讨论】:

    标签: php arrays string curl


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢。如何将字符串转回数组?我试过$getNames = unserialize($getNames);,但没用。有替代品吗?
    • 要使用 unserialize() 接收数据,您需要在发送数据时使用 serialize() 而不是 print_r()。然后它应该可以按您的预期工作。
    • @Tom 使用正确的序列化格式serialize() 是一种选择,JSON、XML 是其他选择。
    • 我正在尝试将返回的数组与另一个数组合并,但收到此错误:Argument #1 is not an arrayserialize() 不起作用的原因可能是什么?
    • @Tom ...你是如何使用serialize的?
    【解决方案2】:

    如果foo.php 通过调用print_r() 产生它的输出,那么这就是另一个脚本(使用curl 的那个)得到的。 IE。一个看起来像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 的一个很好的替代方案。

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

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

    【讨论】:

    • 感谢您的精彩解释!我设法在此基础上解决了我的数据问题!
    猜你喜欢
    • 2013-10-09
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多