Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Многомерный массив в цикле

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Создание
Viper
Отправлено: 06 Июня, 2014 - 10:02:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Задача такова.

Есть данные из формы вида


Есть метод для получения значения вида
PHP:
скопировать код в буфер обмена
  1. $input->post->get('val', null, int');


Проблема в том что таким образом нельзя получить данные из массива 'arr'(для этого есть отдельный метод getArray()).

Я же хочу чтобы можно было имя переменной указывать как путь, только разделенный точками. Т.е.
PHP:
скопировать код в буфер обмена
  1. $input->post->get('arr.arr1.val', null, int');

с учетом того, что вложенность массива заранее неизвестна.

На данный момент застрял на обработке пути.

PHP:
скопировать код в буфер обмена
  1. public function _get($name, $default = null, $filter = 'cmd', $use_path = false) {
  2.         if (isset($this->data[$name])) {
  3.                 if ($use_path) {
  4.                         $name_arr = explode('.', $name);
  5.  
  6.                         if (count($name_arr) > 1) {
  7.                                 // Тут нужно составить массив.
  8.                                 // Т.е. что-то наподобие $this->data[$name][$name1][$val]
  9.                         }
  10.                 } else {
  11.                         return $this->filter->clean($this->data[$name], $filter);
  12.                 }
  13.         }
  14.  
  15.         return $default;
  16. }


Есть идеи как реализовать?

PS! Для обработки элементов массива у которых имя ключа содержит точки я специально ввел параметр $use_path.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
SAD
Отправлено: 06 Июня, 2014 - 10:14:54
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




мож сделать expode и для каждого значения вызывать функцию _get ?
 
 Top
Мелкий Супермодератор
Отправлено: 06 Июня, 2014 - 10:19:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Viper пишет:
if (isset($this->data[$name])) {

Условие немного не там получается.

PHP:
скопировать код в буфер обмена
  1. function _get($name, $default = null, $filter = 'cmd', $use_path = false) {
  2.         $rgArray = array(
  3.                 'null' => null,
  4.                 'bar'=>1,
  5.                 'foo'=>array('foo1'=>array('foo2'=>5)),
  6.                 );
  7.         if ($use_path) {
  8.                 $mStepValue = $rgArray;
  9.                 foreach (explode('.', $name) as $key) {
  10.                         if (is_array($mStepValue) and array_key_exists($key, $mStepValue))
  11.                                 $mStepValue = $mStepValue[ $key ];
  12.                         else return $default;
  13.                         }
  14.                 return $mStepValue;
  15.         } else {
  16.                 return array_key_exists($name, $rgArray) ? $rgArray[ $name ] : $default;
  17.                 }
  18.         }
  19.  
  20. var_dump(_get('bar'));
  21. var_dump(_get('null', 5));
  22. var_dump(_get('foo.foo1', null, 'cmd', true));

У меня вот так получилось.
Второй пример демонстрирует, почему использую array_key_exists вместо isset.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 06 Июня, 2014 - 10:20:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




PHP:
скопировать код в буфер обмена
  1. $param = $_POST[array_shift($name_arr)];
  2.  
  3. foreach ($name_arr as $key){
  4.         $curr = $param[$key];
  5.         if (!is_array($curr)){
  6.                 return $curr;
  7.         }
  8. }

(Отредактировано автором: 06 Июня, 2014 - 13:36:47)

 
 Top
Viper
Отправлено: 06 Июня, 2014 - 11:21:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




LIME что есть $next в вашем примере?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Ch_chov
Отправлено: 06 Июня, 2014 - 11:27:47
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Если точно известно, что ключи существуют, то множно так (в новых версиях PHP):
$input->post->get('arr', null, int')['arr1']['val'];

В друпале есть такая функция:
https://api[dot]drupal[dot]org/api/drupa[dot][dot][dot]%3A%3AgetValue/8
 
 Top
LIME
Отправлено: 06 Июня, 2014 - 11:31:51
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Viper $curr ))
Ch_chov действительно
 
 Top
Viper
Отправлено: 06 Июня, 2014 - 13:35:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Ch_chov вы правы. Можно и так, но есть одно но. Нужно все равно фильтровать конечные данные. А ::filter() будет в результате вызываться 2 раза на одном и том же месте.

В общем получилось так
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Gets a value from the input data.
  3.  *
  4.  * @param   string   $name       Name of the value to get or dot-separated path if it's an array.
  5.  * @param   mixed    $default    Default value to return if variable does not exist.
  6.  * @param   string   $filter     Filter to apply to the value.
  7.  * @param   boolean  $use_path   Use $name as dot-separated path to get the array value.
  8.  *
  9.  * @return  mixed  The filtered input value.
  10.  */
  11. public function get($name, $default = null, $filter = 'cmd', $use_path = false) {
  12.         if ($use_path) {
  13.                 $data = $this->data;
  14.                 $keys = explode('.', $name);
  15.  
  16.                 if (count($keys) > 1) {
  17.                         foreach ($keys as $key) {
  18.                                 if (is_array($data) && array_key_exists($key, $data)) {
  19.                                         $data = $data[$key];
  20.                                 } else {
  21.                                         return $default;
  22.                                 }
  23.                         }
  24.  
  25.                         return $this->filter->clean($data, $filter);
  26.                 } else {
  27.                         if (array_key_exists($name, $this->data)) {
  28.                                 return $this->filter->clean($this->data[$name], $filter);
  29.                         }
  30.                 }
  31.         } else {
  32.                 if (array_key_exists($name, $this->data)) {
  33.                         return $this->filter->clean($this->data[$name], $filter);
  34.                 }
  35.         }
  36.  
  37.         return $default;
  38. }


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Ch_chov
Отправлено: 06 Июня, 2014 - 14:01:16
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Viper пишет:
/**
 * Gets a value from the input data.
 *
 * @param   string   $name       Name of the value to get or dot-separated path if it's an array.
 * @param   mixed    $default    Default value to return if variable does not exist.
 * @param   string   $filter     Filter to apply to the value.
 * @param   boolean  $use_path   Use $name as dot-separated path to get the array value.
 *
 * @return  mixed  The filtered input value.
 */
public function get($name, $default = null, $filter = 'cmd', $use_path = false) {
        if ($use_path) {
                $data = $this->data;
                $keys = explode('.', $name);
 
                if (count($keys) > 1) {
                        foreach ($keys as $key) {
                                if (is_array($data) && array_key_exists($key, $data)) {
                                        $data = $data[$key];
                                } else {
                                        return $default;
                                }
                        }
 
                        return $this->filter->clean($data, $filter);
                } else {
                        if (array_key_exists($name, $this->data)) {
                                return $this->filter->clean($this->data[$name], $filter);
                        }
                }
        } else {
                if (array_key_exists($name, $this->data)) {
                        return $this->filter->clean($this->data[$name], $filter);
                }
        }
 
        return $default;
}


Viper, может быть я не до конца осознал все прелести использования ООП, но твою супер функцию можно заменить одной строкой. Огорчение
PHP:
скопировать код в буфер обмена
  1. $value = isset($_POST['arr']['arr1']['val']) ? $filter->clean($_POST['arr']['arr1']['val']) : 'Default value';

(Отредактировано автором: 06 Июня, 2014 - 14:02:08)

 
 Top
Viper
Отправлено: 06 Июня, 2014 - 14:23:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Ch_chov если руками писать то да. А если используя класс в CMS то нет.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB