Запуск «strpos» для каждого элемента массива

#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:

использовать

array_walk с strpos

array_walk

Комментарии:

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 ответа.