I have the following array:
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',
),
)
I am trying to use recursively loop through the array and take the value of 'type' from the sub array and make it the value of the parent. For example, end result:
array (
'extension' => 'string',
'filename' => 'string',
'size' => 'number',
'created' =>
array (
'date' => 'string'
'timezone' => 'string',
'timezone_type' => 'number'
),
I am able to produce a result that works on the first level of arrays, but cant get it to traverse into the nested arrays. My code is:
$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'] ;
}
}
}
}
Which outputs:
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',
)