У меня есть массив значений записей, который выглядит следующим образом:
$_POST['children'] = array(
[0]=>array(
'fname' => 'name',
'mname' => 'mname',
'lname' => 'lname,
'dob' => '10/17/1992
),
[1]=>array(
'fname' => 'name',
'mname' => 'mname',
'lname' => 'lname,
'dob' => '10/17/1992
),
[2]=>array(
'fname' => 'name',
'mname' => 'mname',
'lname' => 'lname,
'dob' => '10/17/1992
)
);
// and so on
У меня есть скрипт, настроенный в моих функциях просмотра, который проверяет старый ввод и повторно заполняет значения в случае, если форма не проверяется. Мне нужно найти способ вернуть вышеуказанный массив в виде серии пар ключ / значение, т.е.
'children[0][fname]' = 'name'
'children[0][mname]' = 'mname'
'children[0][lname]' = 'lname'
// ... and so on for all fields
В идеале я хотел бы, чтобы это работало с массивом любой глубины, что заставляет меня думать, что мне нужна какая-то рекурсивная функция для форматирования клавиш. Я ужасно переживаю, как это сделать.
Я работал со следующей функцией:
function flatten($post_data, $prefix = '') {
$result = array();
foreach($post_data as $key => $value) {
if(is_array($value)) {
if($prefix == ''){
$result = $result + flatten($value, $prefix. $key );
}else{
$result = $result + flatten($value, $prefix. '[' . $key . ']');
}
}
else {
$result[$prefix . $key .''] = $value;
}
}
return $result;
}
Это сближает меня, но не совсем верно. Он возвращает следующее, когда я передаю ему свой массив $ _POST
[children[1]fname] => test
[children[1]mname] => test
[children[1]lname] => test
[children[1]dob] =>
// Expecting: children[1][fname] => test
// ...
Или есть потенциально более простой способ сделать это?
Что в итоге сработало для меня:
function flatten($post_data, $prefix = '') {
$result = array();
foreach($post_data as $key => $value) {
if(is_array($value)) {
if($prefix == ''){
$result = $result + flatten($value, $prefix. $key );
}else{
$result = $result + flatten($value, $prefix. '[' . $key . ']');
}
}
else {
if( $prefix == ''){
$result[$prefix . $key.''] = $value;
}else{
$result[$prefix . '['.$key.']'.''] = $value;
}
}
}
return $result;
}
это не учитывало возвращаемое значение последнего вызова рекурсивной функции, являющееся скалярным значением. Добавление этого оператора if / else, кажется, разрешило это.
if( $prefix == ''){
$result[$prefix . $key.''] = $value;
}else{
$result[$prefix . '['.$key.']'.''] = $value;
}
Других решений пока нет …