Php - поиск ключей в массиве, который соответствует шаблону

У меня есть массив, который выглядит так:

 Array ( [2.5] => ABDE [4.8] => Some other value ) 

Как мне найти пару ключей/значений, где ключ соответствует шаблону? Я буду знать значение первой цифры в ключе, но не второе. поэтому, например, используя префикс "2.", я хочу как-то найти ключ "2.5" и вернуть как ключ, так и значение "ABDE".

Я думал об использовании регулярного выражения с таким шаблоном, как:

$prefix = 2;
$pattern = '/'.$prefix.'\.\d/i';

а затем цикл через массив и проверку каждого ключа. (кстати, только для демонстрационных целей префикс $был жестко закодирован до 2, но в реальной системе это значение предоставляется пользователем).

Мне интересно, есть ли более простой способ сделать это?

Спасибо.

Ответ 1

вы можете просто перебрать массив и проверить клавиши

$array = array(...your values...);

foreach($array as $key => $value) {
    if (preg_match($pattern,$key)){
        // it matches
    }
}

Вы можете обернуть его в функцию и передать свой шаблон в качестве параметра

Ответ 2

Я думаю, вам нужно что-то вроде этого:

$keys = array_keys($array);
$result = preg_grep($pattern, $keys);

Результатом будет массив, содержащий все ключи, соответствующие регулярному выражению. Клавиши могут использоваться для получения соответствующего значения.

Посмотрите на функцию preg_grep.

Ответ 3

Старый вопрос, но вот что мне нравится делать:

$array = [ '2.5' => 'ABDE', '4.8' => 'Some other value' ];

preg_grep + array_keys найдет все клавиши

$keys = preg_grep( '/^2\.\d/i', array_keys( $array ) );

Вы можете добавить array_intersect_key и array_flip, чтобы извлечь фрагмент массива, соответствующий шаблону

$vals = array_intersect_key( $array, array_flip( preg_grep( '/^2\.\d/i', array_keys( $array ) ) ) );

Ответ 4

Это мои пути

$data = ["path"=>"folder","filename"=>"folder/file.txt","required"=>false];

// FIRST WAY

$keys = array_keys($data);
if (!in_array("path", $keys) && !in_array("filename",$keys) && !in_array("required",$keys)) {
    return myReturn(false, "Dados pendentes");
}

// SECOND WAY

$keys = implode("," array_keys($data));
if (!preg_match('/(path)|(filename)|(required)/'), $keys) {
    return myReturn(false, "Dados pendentes");
}

Ответ 5

Чтобы получить только часть массива с соответствующими ключами, вы также можете написать

$matching_array = array_flip(preg_grep($pattern, array_flip($your_array)));

Это может привести к проблемам с производительностью, если ваш массив становится слишком большим.

Ответ 6

Для будущих программистов, которые сталкиваются с той же проблемой. Вот более полное решение, которое не использует циклы.

    $array = ['2.5'=> 'ABCDE', '2.9'=>'QWERTY'];
    $keys = array_keys($array);
    $matchingKeys = preg_grep('/^2\.+/', $keys);
    $filteredArray = array_intersect_key($array, array_flip($matchingKeys));
    print_r($filteredArray);