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

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

Сообщение Anonymous »

21.11.2025: Тот, кто решил закрыть это, не удосужился прочитать вопрос и поспешно и неправильно отметил его как дубликат.
Здесь конкретно обсуждается преобразование строки во вложенный элемент многомерного массива, а не просто доступ к указанному элементу массива.

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

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 и использует его внутри себя, взаимодействуя с переменной POST только один раз при очистке/проверке отправки формы. У меня возникла проблема, и я отследил ее до размерной переменной POST, а затем решил, что было бы разумно обновить класс, чтобы он мог обрабатывать многомерные массивы.
Ну, проблема в том, что я не могу найти хороший способ преобразовать строковое представление переменной запроса, например $name = 'product[1]';, в $value = $_POST['product'][1];. Ничего страшного, если я беспокоюсь только об одном уровне, но мне нужно было более надежное решение, которое потенциально могло бы поддерживать любую глубину.
Хотя, возможно, это не лучшая идея иметь форму с многомерным массивом, опускающимся на 5 уровней вниз, я понял, что заставить функцию делать это было загадкой. Представьте себе, что одна и та же функция поддерживает следующее:

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

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»