使用递归重建PHP数组



我有以下数组:

array (
'extension' => 
array (
'type' => 'string',
'format' => 'file-extension',
),
'filename' => 
array (
'type' => 'string',
'format' => 'filename',
),
'size' => 
array (
'type' => 'number',
),
'created' => 
array (
'date' => 
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' => 
array (
'type' => 'string',
'format' => 'string',
'example' => 'America/New_York',
),
'timezone_type' => 
array (
'type' => 'number',
),
),
'name' => 
array (
'type' => 'string',
'format' => 'string',
),
'modified' => 
array (
'date' => 
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' => 
array (
'type' => 'string',
'format' => 'string',
),
'timezone_type' => 
array (
'type' => 'number',
),
),
'description' => 
array (
'type' => 'string',
'format' => 'string',
),
'type' => 
array (
'type' => 'string',
'format' => 'string',
),
'uuid' => 
array (
'type' => 'string',
'format' => 'uuid',
),
)

我试图通过数组使用递归循环,并从子数组中获取"类型"的值,并使其成为父数组的值。例如,最终结果:

array (
'extension' => 'string',
'filename' => 'string',
'size' => 'number',
'created' => 
array (
'date' => 'string'
'timezone' => 'string',
'timezone_type' => 'number'
),

我能够生成一个在数组的第一层上工作的结果,但不能让它遍历到嵌套的数组。我的代码是:

$fields = array (
'extension' => 
array (
'type' => 'string',
'format' => 'file-extension',
),
'filename' => 
array (
'type' => 'string',
'format' => 'filename',
),
'size' => 
array (
'type' => 'number',
),
'created' => 
array (
'date' => 
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' => 
array (
'type' => 'string',
'format' => 'string',
'example' => 'America/New_York',
),
'timezone_type' => 
array (
'type' => 'number',
),
),
'name' => 
array (
'type' => 'string',
'format' => 'string',
),
'modified' => 
array (
'date' => 
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' => 
array (
'type' => 'string',
'format' => 'string',
),
'timezone_type' => 
array (
'type' => 'number',
),
),
'description' => 
array (
'type' => 'string',
'format' => 'string',
),
'type' => 
array (
'type' => 'string',
'format' => 'string',
),
'uuid' => 
array (
'type' => 'string',
'format' => 'uuid',
),
);
self::traverseArray($fields);

public static function traverseArray(&$fields) {
foreach ($fields as $field => $val) {
foreach ($val as $value) {
if (is_array($value)) {
foreach ($value as $_key => $_val) {
self::traverseArray($val);
}
} else {
$fields[$field] = $val['example'] ?? $val['format'] ?? $val['type'] ;
}
}
}
}

输出:

array (
'extension' => 'file-extension',
'filename' => 'filename',
'size' => 'number',
'created' => 
array (
'date' => 
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' => 
array (
'type' => 'string',
'format' => 'string',
'example' => 'America/New_York',
),
'timezone_type' => 
array (
'type' => 'number',
),
),
'name' => 'string',
'modified' => 
array (
'date' => 
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' => 
array (
'type' => 'string',
'format' => 'string',
),
'timezone_type' => 
array (
'type' => 'number',
),
),
'description' => 'string',
'type' => 'string',
'uuid' => 'uuid',
)

你的函数中有太多的循环,使事情变得混乱。您需要从一个简单的测试开始,以确定该值是另一个字段数组,还是您的类型/格式/示例数组。测试类型键是否存在似乎是实现这一点的方法。如果它是另一个值数组,则执行递归调用,否则保存该值。您不需要在递归调用分支中有另一个foreach循环,这将在发生新函数调用时发生。

还需要在原始文件中保留递归数组的结果。如果您只使用返回值而不是使用引用,则更容易管理此问题。

$fields = convertArray($fields);
print_r($fields);
function convertArray($fields) {
foreach ($fields as $field => $val) {
if (array_key_exists('type', $val)) {
$fields[$field] = $val['example'] ?? $val['format'] ?? $val['type'] ;
} else {
$fields[$field] = convertArray($val);
}
}
return $fields;
}

相关内容

  • 没有找到相关文章

最新更新