- Търсене на ключ в масиви
12
WT форуми -> PHP MySQL ASP.NET -> Търсене на ключ в масиви
Създайте нова тема Напишете отговор 
Автор Съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 416
Мнение 16/08/2017 6:13 pm     Търсене на ключ в масиви Отговорете с цитат


Това ми е масива.
PHP code:
$arr2 = array(

'news/([0-9]+)' => 'News/view/$1',
'inde' => 'Master/index' ,

);

Това ми е проверката за съществуващ ключ
PHP code:
array_key_exists('news/1', $arr2);

Но ми дава false Как да направя проверката да е верна?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ttta
Нов
Нов

Регистриран на: 11/08/2017 9:41 am

Support: 0
Bonus: 0
Мнения: 14
Мнение 16/08/2017 6:38 pm      Отговорете с цитат


Аз не разбирам много, ма все си мисля, че за да е "вярна проверката" трябва да търсиш ключ който го има в масива.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 341
Bonus: 680
Мнения: 2562
Мнение 16/08/2017 6:38 pm      Отговорете с цитат


Това, кеото имаш в ключовете е вид патърн. Нормалния key_exists няма как да работи. Ето нещо за като начало, но работи само за един параметър:


function preg_key_exists($search, $array) {
   $keys = array_keys($array);
   $filtered = array_filter($keys, function($key) use ($search) {
      if(strpos($key, '{') !== false && strpos($key, '}') !== false) {
         $exploded = explode('{', $key);
         $pattern = rtrim($exploded[1], '}');
         preg_match('#'.$exploded[0].$pattern.'#', $search, $matches);
         return count($matches) > 0;
      } else {
         return $key === $search;
      }
   });
   return count($filtered) > 0;
}


Тест:

$arr2 = array(
   'news/{([0-9]+)}' => 'News/view/$1',
   'inde' => 'Master/index'
); 

var_dump(preg_key_exists('inde', $arr2));
//TRUE


var_dump(preg_key_exists('news/10', $arr2));
// TRUE


var_dump(preg_key_exists('indesadasdsadasd', $arr2));
//FALSE


Тук има повече информация за такъв тип задачки:
https://github.com/nikic/FastRoute/blob/master/src/RouteParser/Std.php
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 416
Мнение 17/08/2017 1:28 pm      Отговорете с цитат


При мен не работи дава ми null.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 341
Bonus: 680
Мнения: 2562
Мнение 17/08/2017 1:53 pm      Отговорете с цитат


pro12 написа:
При мен не работи дава ми null.

Версия на php? При мен на 5.5, 5.6 и 7.0 си е ок.

С какъв input тестваш?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 416
Мнение 17/08/2017 3:41 pm      Отговорете с цитат


с news/3
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 40
Bonus: 80
Мнения: 563
Мнение 17/08/2017 5:12 pm      Отговорете с цитат


Защо си усложнявате живота?

PHP code:

<?php
$arr2 = array(
'#news/([0-9]+)#' => 'News/view/$1',
'#inde#' => 'Master/index',
);

// test 1
$input = "news/34";
$result = preg_filter(array_keys($arr2), array_values($arr2), $input);
echo $result; // result: News/view/34

echo PHP_EOL;
// test 2
$input = "inde";
$result = preg_filter(array_keys($arr2), array_values($arr2), $input);
echo $result; // result: Master/index


Въпроса е, че шаблоните трябва да ги заградиш с разделители(в случая аз използвам #).
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 416
Мнение 17/08/2017 5:43 pm      Отговорете с цитат


Ако сложа разделители работи, но останалия код спира да ми работи. Има ли начин да стане без разделители?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 40
Bonus: 80
Мнения: 563
Мнение 17/08/2017 5:50 pm      Отговорете с цитат


pro12 написа:
Ако сложа разделители работи, но останалия код спира да ми работи. Има ли начин да стане без разделители?


Така работят preg_* функциите. Изискват да има разделители.

А какво толкова чупи в твоя код? Дай да видим и може да се измисли нещо.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ttta
Нов
Нов

Регистриран на: 11/08/2017 9:41 am

Support: 0
Bonus: 0
Мнения: 14
Мнение 17/08/2017 6:29 pm      Отговорете с цитат


Revelation написа:
Въпроса е, че шаблоните трябва да ги заградиш с разделители(в случая аз използвам #).


Дам, вместо да ги сложим на единственото място на което се ползват като регулярен израз ще ги пишем във всеки ключ като по този начин всички останали извиквания за проверка на ключ ще трябва да се преправят.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 40
Bonus: 80
Мнения: 563
Мнение 17/08/2017 6:45 pm      Отговорете с цитат


ttta написа:
Revelation написа:
Въпроса е, че шаблоните трябва да ги заградиш с разделители(в случая аз използвам #).


Дам, вместо да ги сложим на единственото място на което се ползват като регулярен израз ще ги пишем във всеки ключ като по този начин всички останали извиквания за проверка на ключ ще трябва да се преправят.


За да ги сложиш на единственото място трябва да промениш изцяло метода на обработка. Не можеш просто така да ги добавиш, защото променяш типа на аргумента от масив на стринг и не можеш да обработиш всички ключове. Другия варинт е да се извърта масива с обикновен цикъл и да се прави проверката с preg_match. Но тогава няма да трябва просто preg_match, а и някои други проверки.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ttta
Нов
Нов

Регистриран на: 11/08/2017 9:41 am

Support: 0
Bonus: 0
Мнения: 14
Мнение 18/08/2017 7:25 am      Отговорете с цитат


Ето, че си знаел как трябва да се напише.
Хайде сега го напиш както трябва, та да не чупиш цялото приложение.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
12
Страница 1 от 2


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети