使用$ result = json_decode(json_encode($ result),true)将std对象数组传递给数组数组

时间:2018-03-08 01:04:35

标签: php

$result = AssetModel::biGetRecords($userId);

结果是对象数组。

像这样

array(100) {
[0]=>
object(stdClass)#1120 (3) {
["id"]=>
int(1058064)
["asset_id"]=>
string(16) "12345"
["name"]=>
string(22) "David"
}
[1]=>
object(stdClass)#1116 (3) {
["id"]=>
int(1058088)
["asset_id"]=>
string(16) "34567"
["name"]=>
string(6) "Smith"

所以我用

$result = json_decode(json_encode($result), true); 

将std对象数组传递给数组数组。

工作正常。但是当新的记录加入时。突然间

 $result = json_decode(json_encode($result), true); 

而不是返回数组数组,它​​现在返回空数组。

我的猜测是一些带有一些无效字符的新记录会使json_encode返回无效的json字符串,所以下一步json_decode不起作用?

echo "get results: ";

echo count($result);

$result = json_decode(json_encode($result), true);

echo " count data results again: ";

echo count($result);

结果是

get results: 397320 count data results again: 0

所以我的问题是

  • $result = json_decode(json_encode($result), true)不是将对象数组传输到数组数组的防错方法吗?
  • 如果上述情况属实,那么将对象数组传输到数组数组的最简单方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

关于限制结果的your comment后,我的想法是你的脚本达到了内存限制。我会尝试按项目执行编码/解码...

这将按项目级别执行翻译。

$mocklist = array_fill( 0, 100, (object) array('foo'=>'foo','bar'=>'bar') );

array_walk( $mocklist, function( &$value ){
  $value = json_decode( json_encode( $value ), true );
});

print_r( $mocklist );

您还可以利用它来查找粗略的手动调试方式中哪个$值变为空。

array_walk( $mocklist, function( $value ){
  if( empty( json_decode( json_encode( $value ), true ) )
  {
    print_r( $value );
    exit('Found the empty one!');
  }
});

答案 1 :(得分:0)

Scuzzy建议,我应该使用php.net/manual/en/function.json-last-error-msg.php来报告错误。

是。当我执行json_encode时出错。

Malformed UTF-8 characters, possibly incorrectly encoded

由于两个原因,我之前经常遇到这个UTF-8格式错误的问题

  • 数据库表未进行utf8编码。
  • 数据传输采用xml格式而不是json格式

但是自从数据库'表格今天主要编码为utf8,并且越来越多的数据以json格式传输而不是xml,我很长时间没有遇到过utf8字符问题。

现在回到我的问题,我的表是

ENGINE=InnoDB DEFAULT CHARSET=utf8 

我需要弄清楚为什么这些表的查询结果仍然给我utf8格式错误的问题。

谢谢!