2013-11-28 4 views
0

Я пытаюсь найти лучший способ использовать точечную нотацию при передаче ключа или набора ключей в функцию и получение этого значения.PHP превратить строку в индексы php post

Пример

shipping.first_name 

Как это выглядит на самом $_POST массива:

$_POST[shipping][first_name] = 'some value' 

Я хотел бы быть в состоянии передать в (в качестве параметра) строка, и есть возвращение функции значение столбца.

function get_post($str = NULL){ 
    return $_POST[$key1][$key1]..etc. 
} 

Текущая попытка (работает как задумано, но нужно положить в $ _POST):

От: SO Question

function assignArrayByPath(&$arr, $path) { 
     $keys = explode('.', $path); 

     while ($key = array_shift($keys)) { 
      $arr = &$arr[$key]; 
     } 
    } 

    $output = array(); 
    assignArrayByPath($output, $str); 

Это создает массив:

Array ([shipping] => Array ([first_name] =>)) 

Я хотел бы тогда сделать что-то вроде этого:

return isset($_POST.$output) ? true : false; 

Как я могу взять этот массив, созданный из строки, разделенной периодом, и проверить, существует ли она в POST?

Я думаю, что это может быть дубликат, но я не уверен. Приносим извинения заранее, если это так. Буду признателен за любую оказанную помощь.

+0

Может быть, это может помочь: http://stackoverflow.com/questions/1432486/creating-object- instance-from-published-data-php – Babblo

ответ

1

См Laravel array_set реализации http://laravel.com/api/source-function-array_set.html#319

/** 
    * Set an array item to a given value using "dot" notation. 
    * 
    * If no key is given to the method, the entire array will be replaced. 
    * 
    * @param array $array 
    * @param string $key 
    * @param mixed $value 
    * @return array 
    */ 
    function array_set(&$array, $key, $value) 
    { 
      if (is_null($key)) return $array = $value; 

      $keys = explode('.', $key); 

      while (count($keys) > 1) 
      { 
        $key = array_shift($keys); 

        // If the key doesn't exist at this depth, we will just create an empty array 
        // to hold the next value, allowing us to create the arrays to hold final 
        // values at the correct depth. Then we'll keep digging into the array. 
        if (! isset($array[$key]) || ! is_array($array[$key])) 
        { 
          $array[$key] = array(); 
        } 

        $array =& $array[$key]; 
      } 

      $array[array_shift($keys)] = $value; 

      return $array; 
    } 

Проверьте, существует вы можете увидеть array_gethttp://laravel.com/api/source-function-array_get.html#224

/** 
    * Get an item from an array using "dot" notation. 
    * 
    * @param array $array 
    * @param string $key 
    * @param mixed $default 
    * @return mixed 
    */ 
    function array_get($array, $key, $default = null) 
    { 
      if (is_null($key)) return $array; 

      if (isset($array[$key])) return $array[$key]; 

      foreach (explode('.', $key) as $segment) 
      { 
        if (! is_array($array) || ! array_key_exists($segment, $array)) 
        { 
          return value($default); 
        } 

        $array = $array[$segment]; 
      } 

      return $array; 
    } 
+0

У меня есть строка для части массива, о которой идет речь. Теперь мне нужно сделать этот массив и вернуть его значение из массива $ _POST. Поэтому при вызове функции get_post он проверяет isset ($ _ POST. $ Output). Это та часть, которую я пытаюсь понять. –

+0

@K_G Посмотрите обновленный ответ – Kai

Смежные вопросы