Получить значение из многомерного ассоциативного массива в Php
У меня есть массив POST-запроса, который выглядит следующим образом
$request = array (size=2)
'licence' => string 'uDyQwFwqV7aQG2z' (length=15)
'user' =>
array (size=7)
'first_name' => string 'Danut' (length=5)
'last_name' => string 'Florian' (length=7)
'username' => string 'daniesy9' (length=8)
'password' => string '123456' (length=6)
'rpassword' => string '123456' (length=6)
'email' => string 'daniesy+1@me.com' (length=16)
'phone' => string '9903131' (length=7)
Фактически это массив, представляющий значения, отправленные формой. Я знаю имя элементов, например, имя пользователя для ввода имеет имя user[username]
и я должен найти соответствующее значение из массива по имени. Что-то вроде:
$key = "user[username]";
$request[key];
есть идеи как это сделать?
Я знаю, что правильный способ сделать это $request["user"]["username"]
но это довольно сложно, потому что я должен использовать имена полей из формы, которые user[username], user[firstname], etc
и он может иметь до 4 уровней глубины.
3 ответа
Ответ в комментариях, но похожий вопрос для преобразования строки в переменную
eval('$username = $request["user"]["username"];');
редактировать
Eval не является допустимым предложением в качестве данных запроса.
Так что я бы предложил второй метод на этом посту
<?php
$request = array(
'user' => array(
'username' => 'joe_blogs'
)
);
function extract_data($string) {
global $request;
$found_matches = preg_match_all('/\[\"([a-z]+)\"\]/', $string, $matches);
if (!$found_matches) {
return null;
}
$current_data = $request;
foreach ($matches[1] as $name) {
if (key_exists($name, $current_data)) {
$current_data = $current_data[$name];
} else {
return null;
}
}
return $current_data;
}
$username = extract_data('request["user"]["username"]');
?>
function findInDepth($keys, $array){
$key = array_shift($keys);
if(!isset($array[$key])){
return FALSE;
}
if(is_array($array[$key])){
return findInDepth($keys, $array[$key]);
}
return $array[$key];
}
$key = "user[username]";
$keys = preg_split("/(\[|\])/", $key);
echo findInDepth($keys, $request);
Эта функция решает мою проблему. Сначала он разбивает строку (так называемое имя ввода) на массив ключей, а затем рецессивно ищет массив по ключам, пока не найдет значение, которое не является массивом, и вернет FALSE
иначе.
Вы можете разделить ключи с точками. Примитивный пример:
<?php
class ArrayDot
{
protected $array = [];
public function __construct(array $array) {$this->array = $array;}
public function get($path)
{
$array = $this->array;
foreach(explode('.', $path) as $key) {
$array = $array[$key];
}
return $array;
}
}
$array = [
'user' => [
'username' => 'tootski',
]
];
$a = new ArrayDot($array);
echo $a->get('user.username'); # tootski