PHP Поиск ключа массива по значению из части слова
Имеется такая проблема.
Массив данных состоящих из url адресов:
array(8) {
[0]=>
string(39) "/update/data?drid=2759&nc=1597034659"
[1]=>
string(42) "/update/nodata?drid=2759&nc=1597034659"
}
Как видите в конце постоянно меняются значения при перезагрузке странице. Мне нужно найти ключ массива по части строки из этих адресов.
Должно получится что то типа:
array_search('data', $array); // 0
array_search('nodata', $array); // 1
Пробовал искать через array_search а в него через strpos нужное значение, но результата ноль.
Возможно ли вообще такое или нет? Буду рад любой помощи)
Ответы (3 шт):
В зависимости от того, какой именно поиск вы хотите использовать, подставьте свой в callback функцию. Например регулярку или как у меня.
$arr = array(
"/update/data?drid=2759&nc=1597034659",
"/update/nodata?drid=2759&nc=1597034659"
);
function findKey($arr, $needle) {
return array_keys(
array_filter(
$arr,
function ($element) {
return strpos($element, $needle) !== false;
}
)
);
}
var_dump(findKey($arr, 'data'));
Решение
$name='data';
foreach($array as $key => $value) {
if(strpos($value, mb_convert_encoding($name, 'cp1251, 'utf-8)) !== false) {
var_dunp($key);
}
}
Спасибо пользователю Bloom
Если вы хотите стабильное решение для проверки пути в URL, вам необходимо парсить строку и проверять где именно находится кусок строки, который вы ищете, иначе вы рискуете получить ложные данные.
function get_needle_keys($array, $needle) {
$result = array();
$length = strlen($needle);
foreach ($array as $key => $val) {
if (false !== ($path = parse_url($val, PHP_URL_PATH))) {
if (!substr_compare($path, $needle, -$length)) {
array_push($result, $key);
}
}
}
return $result;
}
//**************************************************
$array = array(
0 => "/update/data?drid=2759&nc=1597034659",
1 => "/update/nodata?drid=2759&nc=1597034659",
2 => "/update/data?drid=2759&nc=1597034659",
3 => "/update/data/nodata/?drid=2759&nc=nodata",
4 => "/update/nodata?drid=2759&nc=data",
5 => "/update/data?drid=2759&nc=/data/nodata/",
);
// ключи с data (на конце)
var_dump(get_needle_keys($array, "/data"));
// ключи с nodata (на конце)
var_dump(get_needle_keys($array, "/nodata"));
// можно жёстче:
var_dump(get_needle_keys($array, "/update/data"));