web-dev-qa-db-ja.com

部分的な文字列の一致についてPHP配列を検索します

配列があり、'green'という文字列を検索したいのですが。したがって、この場合は$arr[2]が返されます

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

in_array()のような事前定義された関数がありますそれをループするのではなくして、各値を比較しますか?

17
vnncn

Phpのarray_search機能を利用できます。 PHP> = 4.0.5でサポートされています。

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

$m_arrayには、配列の一致する要素が含まれます。

10
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)
24
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;
});

他の引数でクロージャーを使用するために、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

9
Quasdunk

like as sql with '%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
   $a=array("a"=>"red","b"=>"green","c"=>"blue");
   echo array_search("red",$a);
?>

私は同じ問題を抱えているので、これを試してください...

2
dev_dodiya

PHP 5.3以降

array_walk($arr, function($item, $key) {
    if(strpos($item, 'green') !== false) {
        echo 'Found in: ' . $item . ', with key: ' . $key;
    }
});
1
MrCode
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が複数回出現する場合は、これに追加して各キーを配列に追加することをお勧めします。

複数の一致が予想される場合の例(version 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;
    }

}

これは、一致が1つだけの場合にキーを返しますが、$ columnのいずれかの内部に$ 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);

    function to_lower_case($ str){

$ from_array = ["A"、 "B"、 "C"、 "D"、 "E"、 "F"、 "G"、 "H"、 "I"、 "J"、 "K"、 "L "、" M "、" N "、" O "、" P "、" Q "、" R "、" S "、" T "、" U "、" V "、" W "、" X "、 「Y」、「Z」、「Ä」、「Ö」、「Ü」、「Õ」、「Ž」、「Š」];

$ to_array = ["a"、 "b"、 "c"、 "d"、 "e"、 "f"、 "g"、 "h"、 "i"、 "j"、 "k"、 "l "、" m "、" n "、" o "、" p "、" q "、" r "、" s "、" t "、" u "、" v "、" w "、" x "、 "y"、 "z"、 "ä"、 "ö"、 "ü"、 "õ"、 "ž"、 "š"];

foreach($ from_array as $ key => $ val){$ str = str_replace($ val、$ to_array [$ key]、$ str);}

$ strを返す;

}

  1. 通常のstrposを使用して一致を検索します。if(strpos($ lowercased_imploded、 "substring_to_find")!== false){do something}
0
Andrei Kravtsov
function findStr($arr, $str) 
{  
    foreach ($arr as &$s) 
    {
       if(strpos($s, $str) !== false)
           return $s;
    }

    return "";
}

必要に応じて、少し変更するだけで戻り値を対応するインデックス番号に変更できますが、「... return the $ arr [2]」と言ったので、代わりに値を返すように書きました。

0
hirre