Здесь конкретно обсуждается преобразование строки во вложенный элемент многомерного массива, а не просто доступ к указанному элементу массива.
Код: Выделить всё
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, а затем решил, что было бы разумно обновить класс, чтобы он мог обрабатывать многомерные массивы.
Ну, проблема в том, что я не могу найти хороший способ преобразовать строковое представление переменной запроса, например $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
Мобильная версия