【问题标题】:Print value from stdClass Object/array with curly brackets使用大括号从 stdClass 对象/数组打印值
【发布时间】:2026-02-12 12:45:02
【问题描述】:

使用 PHP,我使用 print_r 打印出一个数组 ($result)。但是返回数组的格式对我来说是一个新格式。具体来说,当“reviews_review”(“哇,真棒……”)字段中的文本以这种具有多个值的特定格式找到时,如何检索它?示例:

stdClass Object
 (
 [node_reviews_nid] => 5270
 [reviews_review] => a:2:{s:5:"value";s:38:"Wow, what a great place.  The bestest!";s:6:"format";s:13:"filtered_html";}

那些额外的值和花括号让我很难过。如果我想要node_reviews_nid,我可以简单地使用 $result->node_reviews_nid" - 但是这样做来获取reviews_review 只会检索太多,即,

a:2:{s:5:"value";s:38:"Wow, what a great place.  The bestest!";s:6:"format";s:13:"filtered_html";})

【问题讨论】:

    标签: php arrays object


    【解决方案1】:

    您看到的奇怪的大括号是 PHP 的 serialize 函数的结果。

    基本上,它旨在将复杂的结构(如对象、嵌套数组等)转换为更容易和更安全地传输的简单字符串,例如通过 HTTP。将其视为 JSON 表示,但特定于 PHP(不要尝试json_decode() 序列化值)。

    另外值得注意的是serialize-d 字符串有一个最大长度,超过这个长度就会被截断,所以避免将它用于非常大的结构——你会丢失数据。

    它的反面是unserialize。因此,要阅读评论文本,您首先必须反序列化“reviews_review”属性,然后引用结果数组的“value”索引。

    $review_data = unserialize($result->reviews_review);
    $review_text = $review_data['value'];
    print($review_text);
    

    【讨论】:

    • 啊哈!非常感谢。完美的。我花了很长时间才弄清楚如何解决这个问题 - 因为要弄清楚要使用哪些搜索词来磨练是非常困难的!感谢您和 RiggsFolly 提供出色的答案(相隔一分钟 - 这就是服务!)再次感谢 - K
    【解决方案2】:

    reviews_review 中的数据看起来像一个序列化数组,即使用 serialize() 函数编写

    因此,您需要先使用unserialize() 对其进行反序列化,然后才能使用它

    $review = unserialize($obj->reviews_review);
    print_r($review);
    

    【讨论】: