it-swarm.com.de

durchsuchen Sie ein PHP-Array nach teilweiser Übereinstimmung

Ich habe ein Array und ich möchte nach dem String 'green' suchen. In diesem Fall sollte also der $arr[2] zurückgegeben werden.

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

gibt es eine vordefinierte Funktion wie in_array (), die den Job ausführt, anstatt ihn zu durchlaufen und die einzelnen Werte zu vergleichen?

10
vnncn

Sie können die array_search-Funktion von PHP verwenden. Es wird in PHP> = 4.0.5 unterstützt.

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

$m_array enthält übereinstimmende Elemente des Arrays.

3
smitrp

Für eine partielle Übereinstimmung können Sie das Array iterieren und eine Zeichenfolgen-Suchfunktion wie strpos () verwenden.

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

Für eine genaue Übereinstimmung verwenden Sie in_array ()

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

Es gibt mehrere Möglichkeiten ...

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

Suche das Array mit einer Schleife:

$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); }

Verwenden Sie array_filter ():

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

Um Closures mit anderen Argumenten zu verwenden, gibt es das use- Schlüsselwort. So können Sie es abstrahieren und in eine Funktion einschließen:

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

Hier ein Arbeitsbeispiel: http://codepad.viper-7.com/xZtnN7

5
Quasdunk

für die Suche mit Like as SQL mit '% needle%' können Sie es versuchen

$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);

und das Ergebnis ist

{
  "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);
?>

Ich habe das gleiche Problem, also probiere es aus ...

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

Dies ist eine Funktion für normale oder mehrdimensionale Arrays. 

  • Groß- und Kleinschreibung
  • Funktioniert für normale Arrays und Multidimentional
  • Funktioniert beim Finden von Voll- oder Teilstichen

Hier ist der Code (Version 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;
} 

Hier ist ein Beispiel:

$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 

Nur für mehrdimensionale Arrays - Die $ -Spalte bezieht sich auf den Namen des Schlüssels in jedem Array. Wenn die $ -Nadel mehr als einmal auftrat, empfehle ich, dies hinzuzufügen, um jeden Schlüssel zu einem Array hinzuzufügen. 

Hier ist ein Beispiel, wenn Sie mehrere Übereinstimmungen (Version 2) erwarten:

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;
    }

}

Dies gibt den Schlüssel zurück, wenn er nur eine Übereinstimmung hat. Wenn jedoch in einer der $ -Spalten mehrere Übereinstimmungen für die $ -Nadel vorhanden sind, wird ein Array der übereinstimmenden Schlüssel zurückgegeben.

Hoffe das hilft :)

0
Oli Girling

Eine schnelle Suche nach einem Ausdruck im gesamten Array könnte etwa so aussehen:

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

Um herauszufinden, ob eine Teilzeichenfolge mit UTF-8-Zeichenfolge im Array vorhanden ist, habe ich festgestellt, dass diese Methode viel schneller wäre als die Verwendung von mb_strtolower oder mb_convert_case:

  1. Implodiere das Array in einen String: $ imploded = implode ("", $ myarray); .

  2. Konvertieren Sie implodierte Zeichenfolgen mithilfe der benutzerdefinierten Funktion in Kleinbuchstaben: $ 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 als $ key => $ val) {$ str = str_replace ($ val, $ to_array [$ key], $ str);}

return $ str;

}

  1. Suchen Sie nach Übereinstimmung mit normalen Strpos: if (strpos ($ lowercased_imploded, "substring_to_find")! == false) {tun Sie etwas}
0
Andrei Kravtsov
function findStr($arr, $str) 
{  
    foreach ($arr as &$s) 
    {
       if(strpos($s, $str) !== false)
           return $s;
    }

    return "";
}

Wenn Sie möchten, können Sie den Rückgabewert mit einer kleinen Änderung in die entsprechende Indexnummer ändern. Da Sie jedoch gesagt haben, "... geben Sie den $ arr [2] zurück", schrieb ich ihn, um den Wert stattdessen zurückzugeben.

0
hirre