Търсене на ключ в масиви

pro12

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

	'news/([0-9]+)' => 'News/view/$1',
	'inde' => 'Master/index' ,
     
      );
Това ми е проверката за съществуващ ключ
PHP:
array_key_exists('news/1', $arr2);
Но ми дава false Как да направя проверката да е верна?
 
Аз не разбирам много, ма все си мисля, че за да е "вярна проверката" трябва да търсиш ключ който го има в масива.
 
Това, кеото имаш в ключовете е вид патърн. Нормалния 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
 
Защо си усложнявате живота?

PHP:
<?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 каза:
Ако сложа разделители работи, но останалия код спира да ми работи. Има ли начин да стане без разделители?

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

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

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

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

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

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

След като знаеш как да стане, защо ти не даде решението?

Другото е, че щом му се чупи приложението, значи архитектурно не е измислено добре.
Исках да знам какво точно му се чупи, защото може разделителите да му правят проблем и може и да се размине само със смяната им, вместо да се мисли нов метод на изпълнение.
 
Добре е измислено приложението (най-вероятно де, все пак не мога да го коментирам без да съм го видял) и е съвсем нормално да се счупи когато почнеш да пипаш по константи които не знаеш как, къде и за какво се ползват.

А какво ти харесва и какво не ми е все тая.
 
ttta каза:
Добре е измислено приложението (най-вероятно де, все пак не мога да го коментирам без да съм го видял) и е съвсем нормално да се счупи когато почнеш да пипаш по константи които не знаеш как, къде и за какво се ползват.

А какво ти харесва и какво не ми е все тая.

Селянина си е селянин, непоправимо е.

След като не знам и аз приложението, няма как да дам работещ код. А при положение, че се използват регулярни изрази, би било редно човека, който го прави да е наясно как работи PCRE в PHP.
 
Revelation каза:
Селянина си е селянин, непоправимо е.

Толкова ли ти е беден речника, че почна с личните нападки?

ТИ промени ключовете в масивът след което приложението спря да работи. А аз просто ти посочих какъв е проблема за да не се налага да се напрягаш излишно.

Виж колко добре съм преценил, че интелектът не ти е силна страна, гражданино ...
 
ttta каза:
Revelation каза:
Селянина си е селянин, непоправимо е.

Толкова ли ти е беден речника, че почна с личните нападки?

ТИ промени ключовете в масивът след което приложението спря да работи. А аз просто ти посочих какъв е проблема за да не се налага да се напрягаш излишно.

Виж колко добре съм преценил, че интелектът не ти е силна страна, гражданино ...

Вариантите съм ги обмислил много преди да "ми посочиш "правилния"" начин.
Въпроса е ти защо нищо не даваш, а само се правиш на интересен?
 
Revelation каза:
ttta каза:
Ето, че си знаел как трябва да се напише.
Хайде сега го напиш както трябва, та да не чупиш цялото приложение.

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

След като знаеш как да стане, защо ти не даде решението?

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

Съгласен съм със Revelation. С твоите коментари само дразниш хората. Ако толкова разбираш, нищо не ти пречи да пуснеш 10 реда код и да помогнеш. Ако не искаш не виждам смисъла на регистрацията ти във форума.
 
Аз го направих с цикъл.
PHP:
 $x= array();

         foreach ($this->routes as $key => $value) {
            
            $result = preg_filter("~$key~",  $value, $t);
            echo  $result; // result: News/view/34
            $x[]= $result; 
        } var_dump(array_filter($x));
Според мен е добър вариант.
 
И какъв е смисъла от това?
Ти искаш да получиш стойността на елемента чиито ключ се мачва с подадения параметър...

Демек връщай първото съвпадение а не нов масив.
 

Горе