#php #arrays
#php #массивы
Вопрос:
Мне нужно выяснить, существует ли строка внутри значения массива, но не обязательно является фактическим значением массива.
$array = array(
0 => 'blue',
1 => 'red',
2 => 'green',
3 => 'red'
);
$key = xxxxxx('gr', $array); // $key = 2;
Есть ли встроенный способ сделать это с помощью PHP
Комментарии:
1. Что вы имеете в виду, говоря о $ key = 2? Вы хотите найти определенное значение или определенный ключ?
Ответ №1:
Для этой цели вы можете использовать preg_grep
<?php
$array = array(
0 => 'blue',
1 => 'red',
2 => 'green',
3 => 'red'
);
//$key = xxxxxx('gr', $array); // $key = 2;
$result=preg_grep("/^gr.*/", $array);
print_r($result);
?>
Комментарии:
1. Я бы проголосовал за это дважды, если бы мог, прошло много времени с тех пор, как я вспомнил, что у PHP есть
preg_grep()
функция!2. Я пытаюсь
preg_grep("/^/scripts/GMC/PNetT-5.1-SP1/PNetT.*/", exec('ps -ef | grep GMC', $output));
, но он не находит результат, когда я знаю, что результат существует …. я правильно избегаю этого?3. @Webnet,
exec
не возвращает массив. Используйте две отдельные инструкции, одну для вызоваexec
, а другую для вызоваpreg_grep(..., $output)
. Или пропуститеpreg_grep
полностью и просто поместите это регулярное выражение непосредственно в вашуgrep
команду.4. Psh — вы правы, я сделал это только для того, чтобы вы могли видеть, что я выполняю. На самом деле я перехожу
$output
к preg_grep, но он не соответствует. Это правильно экранировано?5. Да, но это слишком ограничительно.
^
В начале выражения говорится, что подстрока должна начинаться с некоторой строки вывода программы, но это не то, кудаps
помещается командная строка. Удалите^
из начала и.*
из конца (что является избыточным). Кроме того,-
символы не нужно экранировать; обычно они не являются особенными. (Даже в[...]
они не нуждаются в экранировании, если вы поместите их в нужное место.)
Ответ №2:
Функция: array_filter — это то, что вам нужно. Элементы в результирующем массиве будут сохранены только тогда, когда указанная функция вернет для них значение true.
// return true if "gr" found in $elem
// for this value
function isGr($key, $elem)
{
if (strpos($elem, "gr") === FALSE)
{
return FALSE;
}
else
{
return TRUE;
}
}
$grElems = array_filter($array, "isGr");
print_r($grElems);
приводит к:
array(
2=>'green'
)
Ответ №3:
Ваш xxxxxx
был бы array_map
. Но, увы, вы не можете использовать strpos
здесь простой обратный вызов. Чтобы передать фактический параметр поиска, вам необходимо определить пользовательскую или анонимную функцию-
И чтобы получить то, что вы хотите, вам нужно еще больше обернуть:
$key = key(
array_filter(
array_map(
function($s){return strpos($s, "gr");},
$array
),
"is_int")
);
Однако это дает вам искомый индекс 2
.
Ответ №4:
Встроенной функции нет, но поскольку preg_*
функции поддерживают массивы в качестве аргументов, это должно сработать:
$keys = preg_filter('~gr~', '$0', $array);
Ответ №5:
как насчет foreach?
function xxxxxx($str, $array) {
foreach ($array as $key => $value) {
if (strpos($value, $str) !== false) {
return $key;
}
}
return false;
}
Комментарии:
1. Этот метод идеально подходил для того, что мне было нужно. Я немного изменил его, чтобы я мог подавать одиночные и множественные иглы. функция find($haystack, $needles) { $needle = array_map(‘trim’, explode(«,», $needles)); foreach ($needle как $key => $value) { if (strpos($value, $haystack) !== false) { возвращает true; } } возвращает false; } Затем я вызываю что-то вроде find($page, «home, about»);
Ответ №6:
Комментарии:
1. И куда идут аргументы strpos?
Ответ №7:
Пройдитесь по массиву и проверьте каждый элемент, затем верните индекс, если это так.
function substr_in_array($array, $substr) {
foreach ($array as $index => $item) {
if (strrpos($item, $substr)!===FALSE amp;amp; $item != $substr) {
return $index;
}
}
}
Это должно делать то, что вы хотите.
Ответ №8:
Он проверяет с помощью foreach каждый элемент массива с использованием strpos.
<?php
$array = array(
0 => 'blue',
1 => 'red',
2 => 'green',
3 => 'red'
);
$search='aaa';
function arraysearch($array,$search){
foreach ($array as $element){
if(strpos($element,$search)!==FALSE){
return TRUE;
}
}
return FALSE;
}
echo arraysearch($array,$search);
?>
Ответ №9:
В PHP 5.3 вы можете сделать это одной командой, используя array_filter и анонимную функцию:
$keys = array_filter($array, function($var){ return strpos($var, 'gr') !== false; });
Ответ №10:
Используя PHP >= 5.3.0, вы могли бы использовать анонимные функции в качестве обратного вызова для фильтрации этого массива с помощью array_filter.
$array = array(
0 => 'blue',
1 => 'red',
2 => 'green',
3 => 'red'
);
$search = 'gr';
$key = array_filter($array, function($element) use($search) {
return strpos($element,$search) !== FALSE;
});
Это улучшенная версия Shay Ben Moshe
ответа.