Обработка многомерных массивов POST с неоднозначной глубинойPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Обработка многомерных массивов POST с неоднозначной глубиной

Сообщение Anonymous »

Как мне преобразовать строку во вложенный элемент многомерного массива (а не просто получить доступ к указанному элементу массива)?

Код: Выделить всё

function foo(string $string) {
// convert $string to the multidimensional array element named
return $array_element;
}

$a = 'b[1]'; // STRING
echo foo($a);
// The value of $_POST['b'][1]

$c = 'b[1][2][3][4][5][6][7][8][9][apple]'; // STRING
echo foo($c);
// The value of $_POST['b'][1][2][3][4][5][6][7][8][9][apple]
Я создал построитель форм и класс обработки в своей собственной среде. Класс принимает имя переменной POST и взаимодействует с ней только при очистке/проверке отправки формы. У меня возникла проблема с размерной переменной POST, и я решил обновить класс для обработки многомерных массивов.
Как преобразовать строковое представление переменной запроса, например $name = 'product[1]';, в $value = $_POST['product'][1];? Мне нужно было решение, которое могло бы поддерживать любую глубину. Представьте себе, что одна и та же функция поддерживает следующее:

Код: Выделить всё

function foo($name) {
$bits = explode('[',$name);
foreach ($bits as $id => $v) $bits[$id] = rtrim($v,']');
// magic happens below
return $_POST[$bits[0]][$bits[1]]...[$bits[x]];
}
Это позволит обрабатывать любую глубину:

Код: Выделить всё

// $_POST['product'][22] = 'armchair';
$name = 'product[22]';
$value = foo($name);
echo $value
// armchair

// Absurd example
// $_POST['product'][1][2][3][4][5][6][7][8] = 'extreme';
$name = 'product[1][2][3][4][5][6][7][8]';
$value = foo($name);
echo $value;
// extreme
Это не обрабатывает неоднозначную глубину:

Код: Выделить всё

function bar($name) {
$bits = explode('[',$name);
foreach ($bits as $id => $b) $bits[$id] = rtrim($b,']');
switch (count($bits)) {
case 2:
return $_POST[$bits[0]][$bits[1]];
case 3:
return $_POST[$bits[0]][$bits[1]][$bits[2]];
case 4:
return $_POST[$bits[0]][$bits[1]][$bits[2]][$bits[3]];
case 5:
return $_POST[$bits[0]][$bits[1]][$bits[2]][$bits[3]][$bits[4]];
case 6:
return $_POST[$bits[0]][$bits[1]][$bits[2]][$bits[3]][$bits[4]][$bits[5]];
default:
return $_POST[$name];
}
}
Как перейти от строки, представляющей многомерный массив, к доступу к значению, указанному в этом массиве?

Подробнее здесь: https://stackoverflow.com/questions/788 ... uous-depth
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»