匹配多个项目时递归函数不工作



具有以下结构的数组

[
'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抛出namesize未定义的索引。

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

最新更新