具有以下结构的数组
[
'name' => :string
'size' => :string|int
]
必须递归地在迭代中遇到此结构时转换为对象。
所以我写了这些函数
// Converts an array into the instance of stdclass
function to_entity(array $file){
$object = new stdclass;
$object->name = $file['name'];
$object->size = $file['size'];
return $object;
}
// Converts required arrays into objects
function recursive_convert_to_object(array $files){
foreach ($files as $name => $file) {
// Recursive protection
if (!is_array($file)) {
continue;
}
foreach ($file as $key => $value) {
if (is_array($value)) {
// Recursive call
$files[$name] = recursive_convert_to_object($files[$name]);
} else {
$files[$name] = to_entity($file);
}
}
}
return $files;
}
现在,当提供这样的输入时:
$input = [
'translation' => [
1 => [
'user' => [
'name' => 'Tom',
'size' => 2
]
]
]
];
并像这样调用它,它按预期工作(即一个计数器项user
通过to_entity()
函数转换为stdclass
:
print_r( recursive_convert_to_object($input) );
现在问题来了:
如果提供了这样的输入(即添加了一个键为4 => [...]
的项),则不再可以将E_NOTICE
抛出name
和size
未定义的索引。
$input = [
'translation' => [
1 => [
'user' => [
'name' => 'Tom',
'size' => 2
]
],
4 => [
'user' => [
'name' => 'Tom',
'size' => 5
]
],
]
];
让我重复一下,目标数组的深度是未知的。因此,无论深度是多少,它都必须找到一个数组并将其转换为对象。
那么递归函数中的逻辑问题在哪里?
我不确定这是否是解决问题的最佳方法,但你已经在这上面投入了一些时间。
问题是一旦你替换了数组中的一些内容,你就把一个对象放回数组中。然后当你测试它是否是
中的数组时if (is_array($value)) {
它不是,所以你把它转换成一个实体,它试图再次转换对象。
if ( !is_object($value)) {
$files[$name] = to_entity($file);
}