#42270 [Fbk->Opn]: stdClass could not be converted to string

From: Date: Thu, 16 Aug 2007 12:11:34 +0000
Subject: #42270 [Fbk->Opn]: stdClass could not be converted to string
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-116171@lists.php.net to get a copy of this message
ID: 42270 User updated by: steven dot mccoy at miru dot hk Reported By: steven dot mccoy at miru dot hk -Status: Feedback +Status: Open Bug Type: JSON related Operating System: Ubuntu 7.04 PHP Version: 5.2.4RC1-dev New Comment: The situation I'm using it in is where the browser sends an array of objects to PHP. The PHP scripts uses PEAR::DB_DataObject to generate an array of objects inside a database table, I then use array_diff/array_udiff to calculate what is new, what has changed, and what should be deleted. The array_diff for items that have not changed fails in 5.2 because PHP fails be able to compare some of the stdClass objects. $new_products = array_filter($products, array('Order','is_new_product')); debug('new_order_products: '.count($new_products).' found'); $old_products = array_diff($new_products, $products); debug('old_order_products: '.count($old_products).' calculated'); $updated_products = array_udiff($old_products, $current_products, array('Order', 'product_compare')); debug('updated_order_products: '.count($updated_products).' found'); $deleted_products = array_udiff($current_products, $products, array('Order', 'product_compare_by_id')); debug('deleted_order_products: '.count($deleted_products).' found'); PEAR::DB_DataObject returns table rows as objects, the PHP JSON module defaults to objects, but can include arrays of objects as shown previously. As a workaround I rebuilt PHP 5.1.6 from Ubuntu 6.10 on 7.04. If someone can provide a array_udiff function that can compare objects like before that would be great :-) If the current circumstances are not clear, I will repeat: PHP 5.1.6 generates the expected result output as shown, PHP 5.2 does not. Previous Comments: ------------------------------------------------------------------------ [2007-08-16 11:52:54] jani@php.net Here's what I get for the encode: {"first":[{"second":2},"two","three"]} So actually you have another object inside the first, here's var_dump($obj); object(stdClass)#1 (1) { ["first"]=> array(3) { [0]=> object(stdClass)#2 (1) { ["second"]=> int(2) } [1]=> string(3) "two" [2]=> string(5) "three" } } And using json_decode($json, true): array(1) { ["first"]=> array(3) { [0]=> array(1) { ["second"]=> int(2) } [1]=> string(3) "two" [2]=> string(5) "three" } } So what's the bug? ------------------------------------------------------------------------ [2007-08-16 11:46:15] jani@php.net See also bug #42303 ------------------------------------------------------------------------ [2007-08-13 21:34:06] crrodriguez at suse dot de Workaround : use array_udiff with a supplied callback function or use only arrays. ------------------------------------------------------------------------ [2007-08-12 06:54:01] steven dot mccoy at miru dot hk Reproduced with the Win32 CVS build: PHP 5.2.4RC1-dev (cli) (built: Aug 12 2007 00:04:25) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies ------------------------------------------------------------------------ [2007-08-11 06:13:57] steven dot mccoy at miru dot hk Description: ------------ This might be related to bug 41221, upgrading from PHP 5.1.6-1 (Debian) to 5.2.1 (Ubuntu) created a regression in handling output of JSON decoding. Does this mean that I can only use arrays ( json_decode($json, true) ), and have to update all code appropriately? Reproduce code: --------------- <?php $array = array( "first" => array(array("second" => 2), "two", "three"), ); $json = json_encode($array); $obj = json_decode($json); var_dump(array_diff($array,$obj->first)); ?> Expected result: ---------------- array(1) { ["first"]=> array(3) { [0]=> array(1) { ["second"]=> int(2) } [1]=> string(3) "two" [2]=> string(5) "three" } } Actual result: -------------- Catchable fatal error: Object of class stdClass could not be converted to string in /tmp/- on line 7 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=42270&edit=1

« previous php.bugs (#116171) next »