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 шт):

Автор решения: Dmitry Lin

В зависимости от того, какой именно поиск вы хотите использовать, подставьте свой в 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'));
→ Ссылка
Автор решения: VaDoSiQ

Решение

$name='data';

foreach($array as $key => $value) {
  if(strpos($value, mb_convert_encoding($name, 'cp1251, 'utf-8)) !== false) {
    var_dunp($key);
  }
}

Спасибо пользователю Bloom

→ Ссылка
Автор решения: NoSkill

Если вы хотите стабильное решение для проверки пути в 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"));
→ Ссылка