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]   

> Без описания
arimanecro
Отправлено: 08 Сентября, 2016 - 16:47:42
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Приветствую.

Вот столкнулся с довольно "простой" задачей..

PHP:
скопировать код в буфер обмена
  1. $colors = ['red'=>'', 'green'=>''];
  2.  
  3. function test($value){
  4.  
  5. // показать ключ $value
  6.  
  7. }
  8.  
  9. test($colors['red']); // нужно чтобы вывел red


В массиве специально значения одинаковые, поэтому array_search не прокатит. Ф-ия key также не подойдет, потому что аргументом должен быть массив, а не строка.

(Отредактировано автором: 08 Сентября, 2016 - 16:53:04)

 
 Top
Строитель Модератор
Отправлено: 08 Сентября, 2016 - 18:28:46
Post Id



Участник


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


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




arimanecro пишет:
потому что аргументом должен быть массив, а не строка.
Почему же тогда в аргументе вы передаёте именно строку, а не массив?
 
 Top
IllusionMH
Отправлено: 08 Сентября, 2016 - 18:37:31
Post Id



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


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




arimanecro, вообще бред какой-то. В чем смысл сего действия? Складывается ощущение что решается не та задача и не теми средствами.

по пожеланиям что-то похожнее на Enums из TypeScript
Реализацию можете увидеть здесь https://basarat.gitbooks.io/typescript/content/docs/enums.html

(Отредактировано автором: 08 Сентября, 2016 - 18:38:47)

 
 Top
Строитель Модератор
Отправлено: 08 Сентября, 2016 - 18:41:25
Post Id



Участник


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


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




arimanecro, похоже что вам нужно что-то, вроде этого
PHP:
скопировать код в буфер обмена
  1. $colors = ['red' => '', 'green' => ''];
  2.  
  3. function test($value) {
  4.     return key($value);
  5. }
  6.  
  7. echo test($colors); // Выведет первый ключ в массиве "red"
  8.  
 
 Top
arimanecro
Отправлено: 08 Сентября, 2016 - 23:53:51
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Поясню для чего это...

Есть функция, которая принимает строку, а именно POST значение и внутри этой ф-ии, данное значение проходит фильтрацию и когда фильтрация не пройдена, то выводится ошибка с текстом: Переменная такая-то(а вот здесь и требуется ключ, так как именно он и несет в себе имя переменной) не является(например) имейлом.

Я сейчас не за рабочим компом, поэтому скопировать не могу, но "перескажу" в сжатой форме:

PHP:
скопировать код в буфер обмена
  1. function test($name){
  2.  
  3. if(!filter_var($name, FILTER_VALIDATE_INT)) {
  4.  
  5. $_SESSION['error'][] = "$name не является числом" // естественно подставится значение, а я хочу чтобы отобразилось имя элемента массива
  6.  
  7. }
  8. return $this;
  9. }
  10.  
  11. test($_POST['number'])->test($_POST['name']);


Вообщем самое главное, это отобразить имя элемента массива, который передается в ф-ию.
 
 Top
Sail
Отправлено: 09 Сентября, 2016 - 09:37:24
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




arimanecro пишет:
это отобразить имя элемента массива, который передается в ф-ию

Про то, что переменная, переданная в функцию является элементом массива функции не известно. На то она и функция со своей областью видимости и полученным значением аргумента. Улыбка Даже если передать ссылку на элемент массива, то функция будет оперировать только лишь значением, хранящимся в выделенной для него памяти...
Можно сделать, например, так, чтобы функция принимала ссылку на массив одним аргументом, а индекс требуемого элемента - другим.
 
 Top
Fart
Отправлено: 09 Сентября, 2016 - 11:16:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


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




key() будет достаточно, но предварительно нужно массив изменить и сделать первым значением.

(Отредактировано автором: 09 Сентября, 2016 - 11:48:22)

 
 Top
arimanecro
Отправлено: 09 Сентября, 2016 - 15:09:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Додумал, как это можно сделать Улыбка

Кому интересно выкладываю

PHP:
скопировать код в буфер обмена
  1. trait Validators
  2. {
  3.     public function filterInputs(array $inputs, $filter, $min, $max){
  4.         foreach ($inputs as $k => $v){
  5.             if(array_key_exists($k, $_POST)){
  6.                 $func = "get".$filter;
  7.                 $this->$func($k, $v, $min, $max);
  8.             }
  9.         }
  10.         return $this;
  11.     }
  12.    
  13.  public function getLength($k, $input, $min, $max)
  14.     {
  15.         $options = [
  16.             'options' => [
  17.                 'min_range' => $min,
  18.                 'max_range' => $max
  19.             ]
  20.         ];
  21.        filter_var(strlen($input), FILTER_VALIDATE_INT, $options)
  22.                ? :
  23.            $_SESSION['err_valid'][] = "<strong>".ucfirst($k).":</strong> must be $min-$max characters";
  24.     }
  25. // далее идут ещё функции валидаторы, которые начинаются на get, не буду их копировать, чтобы не загромождать.
  26.  

===========
Приходит ПОСТ, например с полями name, adress, email, вот мы их и фильтруем таким образом:

PHP:
скопировать код в буфер обмена
  1. $this->filterInputs(['name'=>'', 'address'=>''], 'length', 2, 20)
  2.        ->filterInputs(['email'=>''], 'email', 2, 50)


В случае не прохождения фильтрации, ключи корректно заносятся в $_SESSION['err_valid'], что и требовалось А ты думал?
 
 Top
OrmaJever Модератор
Отправлено: 10 Сентября, 2016 - 14:55:32
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




arimanecro пишет:
Есть функция, которая принимает строку, а именно POST значение и внутри этой ф-ии, данное значение проходит фильтрацию и когда фильтрация не пройдена, то выводится ошибка с текстом: Переменная такая-то(а вот здесь и требуется ключ, так как именно он и несет в себе имя переменной) не является(например) имейлом.

Что мешает передавать просто ключ?
PHP:
скопировать код в буфер обмена
  1. function test($key){
  2.  /// $_POST[$key]
  3.  /// if error echo $key
  4. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
arimanecro
Отправлено: 12 Сентября, 2016 - 09:58:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




OrmaJever пишет:
Что мешает передавать просто ключ?


мля...внатуре Превосходно
 
 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