Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用$result=json_decode(json_encode($result),true)将std对象数组传输到数组数组_Php - Fatal编程技术网

Php 使用$result=json_decode(json_encode($result),true)将std对象数组传输到数组数组

Php 使用$result=json_decode(json_encode($result),true)将std对象数组传输到数组数组,php,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) { ["i

结果是对象数组

像这样

$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"
将std对象数组传输到数组数组

它很好用。但当新记录加入时。忽然间

$result = json_decode(json_encode($result), true); 
它现在返回空数组,而不是返回数组的数组

我的猜测是,一些带有无效字符的新记录使json_编码返回无效的json字符串,因此下一步json_解码将无法工作

 $result = json_decode(json_encode($result), true); 
结果是

echo "get results: ";

echo count($result);

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

echo " count data results again: ";

echo count($result);
所以我的问题是

  • $result=json\u decode(json\u encode($result),true)
    将对象数组传输到数组数组不是一种防错的方法吗
  • 如果上述情况属实,那么将对象数组转换为数组数组的最简单方法是什么
谢谢

在讨论限制结果之后,我认为您的脚本达到了内存限制。我会尝试对每个项目进行编码/解码

这将在每个项目级别执行翻译

get results: 397320 count data results again: 0
您还可以利用它以粗略的手动调试方式定位哪个$value变为空

$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 );

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

对。执行json_编码时出错

array_walk( $mocklist, function( $value ){
  if( empty( json_decode( json_encode( $value ), true ) )
  {
    print_r( $value );
    exit('Found the empty one!');
  }
});
由于两个原因,我以前经常遇到UTF-8格式错误的问题

  • 数据库表不是utf8编码的
  • 数据传输是xml格式,而不是json格式
但由于现在数据库的表大多编码为utf8,而且越来越多的数据传输采用json格式,而不是xml格式,因此我已经很久没有遇到utf8字符问题了

现在回到我的问题,我的桌子

Malformed UTF-8 characters, possibly incorrectly encoded
我需要弄清楚为什么这些表的查询结果仍然给我带来utf8格式错误的问题


谢谢

我认为我们需要更多地了解
AssetModel::biGetRecords()
返回的内容以及它是否具有私有/受保护的属性。你能模拟一个例子来说明你的问题中的一个对象记录是什么样子的吗?例如
var_转储(当前($result))为什么要将对象更改为数组?数据将发送到下一个函数进行处理,该函数需要数组数组。我已经使用这种方法很长时间了,没有任何问题。它一直运作良好。如果我将数据库查询限制为返回1000条、2000条记录等,仍然可以。但是如果我返回完整的数据集,那么它就会中断。所以我猜不是对象格式的问题。某些新添加的记录中的数据(字符)会中断进程。是否启用了完整的错误报告?它可能遇到内存限制。如果是这样的话,你可以通过分块执行翻译来批处理转换过程。我认为这可能是内存限制的问题。但我在不同的表上有另一个查询,它的结果(在单个记录和记录数中)比这个查询大。很好。另外,内存限制会给我错误信息。我可以使用其他方法来解决这个特殊问题。但我想知道$result=json_decode(json_encode($result),true);将对象数组传输到数组数组是防错误的。因为我已经多次使用这种方法。如果有问题,我可能需要回去更改其他代码,以避免将来出现同样的问题。是的。我将使用您的建议来找出值何时变为空,从而缩小问题的范围。谢谢谢谢我应该仔细检查php手册。错过了这个功能。我将使用此函数找出问题所在。我猜是utf8问题。如果是这个问题,我会通知你的。谢谢
ENGINE=InnoDB DEFAULT CHARSET=utf8