it-swarm.com.ru

искать массив php для частичного совпадения строк

У меня есть массив, и я хотел бы найти строку 'green'. Так что в этом случае он должен вернуть $arr[2]

$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');

есть ли предопределенная функция, такая как in_array (), которая выполняет задание вместо того, чтобы проходить через него и сравнивать каждое значение?

10
vnncn

Вы можете использовать функцию array_search из php. Это поддерживается в PHP> = 4.0.5.

$array = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');
$m_array = preg_grep('/^green\s.*/', $array);

$m_array содержит совпавшие элементы массива.

3
smitrp

Для частичного совпадения вы можете выполнить итерацию массива и использовать функцию поиска строк, например strpos () .

function array_search_partial($arr, $keyword) {
    foreach($arr as $index => $string) {
        if (strpos($string, $keyword) !== FALSE)
            return $index;
    }
}

Для точного соответствия используйте in_array ()

in_array('green', $arr)
17
n a

Есть несколько способов ...

$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');

Поиск в массиве с помощью цикла:

$results = array();

foreach ($arr as $value) {

  if (strpos($value, 'green') !== false) { $results[] = $value; }

}

if( empty($results) ) { echo 'No matches found.'; }
else { echo "'green' was found in: " . implode('; ', $results); }

Используйте array_filter ():

$results = array_filter($arr, function($value) {
    return strpos($value, 'green') !== false;
});

Чтобы использовать Closures с другими аргументами, существует ключевое слово use-. Таким образом, вы можете абстрагировать его и обернуть в функцию:

function find_string_in_array ($arr, $string) {

    return array_filter($arr, function($value) use ($string) {
        return strpos($value, $string) !== false;
    });

}

$results = find_string_in_array ($arr, 'green');

if( empty($results) ) { echo 'No matches found.'; }
else { echo "'green' was found in: " . implode('; ', $results); }

Вот рабочий пример: http://codepad.viper-7.com/xZtnN7

5
Quasdunk

для поиска с помощью как как SQL с "% needle%" вы можете попробовать с

$input = preg_quote('gree', '~'); // don't forget to quote input string!
$data = array(
    1 => 'orange',
    2 => 'green string',
    3 => 'green', 
    4 => 'red', 
    5 => 'black'
    );
$result = preg_filter('~' . $input . '~', null, $data);

и результат

{
  "2": " string",
  "3": ""
}
2
Kotzilla

PHP 5.3+

array_walk($arr, function($item, $key) {
    if(strpos($item, 'green') !== false) {
        echo 'Found in: ' . $item . ', with key: ' . $key;
    }
});
1
MrCode
<?php
   $a=array("a"=>"red","b"=>"green","c"=>"blue");
   echo array_search("red",$a);
?>

У меня та же проблема, так что попробуйте это ...

1
dev_dodiya
function check($string) 
{
    foreach($arr as $a) {
        if(strpos($a,$string) !== false) {
            return true;
        } 
    }
    return false;
}
1
Louis.CLast

Это функция для нормальных или многомерных массивов. 

  • Без учета регистра
  • Работает для нормальных массивов и многомерных
  • Работает при поиске полного или частичного укуса

Вот код (версия 1)

function array_find($needle, array $haystack, $column = null) {

    if(is_array($haystack[0]) === true) { // check for multidimentional array

        foreach (array_column($haystack, $column) as $key => $value) {
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                return $key;
            }
        }

    } else {
        foreach ($haystack as $key => $value) { // for normal array
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                return $key;
            }
        }
    }
    return false;
} 

Вот пример:

$multiArray = array(
     0 => array(
              'name' => 'kevin',
              'hobbies' => 'Football / Cricket'),
      1 => array(
              'name' => 'tom',
              'hobbies' => 'tennis'),
       2 => array(
              'name' => 'alex',
              'hobbies' => 'Golf, Softball')
);
$singleArray = array(
        0 => 'Tennis',
        1 => 'Cricket',
);

echo "key is - ". array_find('cricket', $singleArray); // returns - key is - 1
echo "key is - ". array_find('cricket', $multiArray, 'hobbies'); // returns - key is - 0 

Только для многомерных массивов - $ column относится к имени ключа внутри каждого массива . Если $ needle появлялся более одного раза, я предлагаю добавить к нему, чтобы добавить каждый ключ в массив. 

Вот пример, если вы ожидаете нескольких совпадений (версия 2):

function array_find($needle, array $haystack, $column = null) {

    $keyArray = array();

    if(is_array($haystack[0]) === true) { // for multidimentional array

        foreach (array_column($haystack, $column) as $key => $value) {
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                $keyArray[] = $key;

            }
        }

    } else {
        foreach ($haystack as $key => $value) { // for normal array
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                $keyArray[] = $key;
            }
        }
    }

    if(empty($keyArray)) {
        return false;
    }
    if(count($keyArray) == 1) {
        return $keyArray[0];
    } else {
        return $keyArray;
    }

}

Это возвращает ключ, если у него только одно совпадение, но если в любом из $ столбца есть несколько совпадений для $ needle, то он вернет массив совпадающих ключей.

Надеюсь это поможет :)

0
Oli Girling

Быстрый поиск фразы во всем массиве может выглядеть примерно так:

if (preg_match("/search/is", var_export($arr, true))) {
    // match
}
0
phoenix

Чтобы выяснить, присутствует ли в массиве нечувствительная к регистру подстрока UTF-8, я обнаружил, что этот метод будет намного быстрее, чем использование mb_strtolower или mb_convert_case:

  1. Внедрить массив в строку: $ imploded = implode ("", $ myarray); .

  2. Преобразовать свернутую строку в нижний регистр с помощью пользовательской функции: $ lowercased_imploded = to_lower_case ($ imploded);

    функция to_lower_case ($ str) {

$ From_array = [ "А", "В", "С", "D", "E", "F", "G", "H", "I", "J", "К", "L », "М", "N", "О", "Р", "Q", "R", "S", "Т", "U", "V", "W", "X", "Y", "Z", "А", "О", "U", "О", "Z", "S"];

$ To_array = [ "а", "б", "в", "г", "е", "F", "G", "H", "I", "J", "K", "л », "м", "н", "о", "р", "д", "т", "с", "т", "U", "V", "ш", "х", "у", "г", "а", "о", "U", "O", "Z", "S"];

foreach ($ from_array как $ key => $ val) {$ str = str_replace ($ val, $ to_array [$ key], $ str);}

вернуть $ str;

}

  1. Поиск совпадений с использованием обычного strpos: if (strpos ($ lowercased_imploded, "substring_to_find")! == false) {сделать что-то}
0
Andrei Kravtsov
function findStr($arr, $str) 
{  
    foreach ($arr as &$s) 
    {
       if(strpos($s, $str) !== false)
           return $s;
    }

    return "";
}

Вы можете изменить возвращаемое значение на соответствующий индекс с небольшой модификацией, если хотите, но так как вы сказали «... вернуть $ arr [2]», я написал его, чтобы вместо этого вернуть значение.

0
hirre