Получить значение из многомерного ассоциативного массива в 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
Другие вопросы по тегам