2016-03-18 5 views
5

ist es möglich, in PHP-Array zu tun, die gleiche tun wir in MySQL.Wie in PHP zu suchen Array, ähnlich wie MySQL Wie% var% search

ZB: Ich habe diese array

array(
    '[email protected]'=> `Mark Mian`, 
    '[email protected]'=> `John jack`, 
    '[email protected]'=> `Bob Logon`, 
    '[email protected]'=> `Stela Josh`, 
    '[email protected]'=> `Json Josh` 
    '[email protected]'=> `Bob Mark` 
) 

und ich würde diese Art der Suche zu tun,

Beispiel: Wenn ich Mark suchen soll es zurückgeben mir diese

'[email protected]' => `Mark Mian

Wenn ich Bob suchen soll es zurückgeben mich

'[email protected]' =>Bob Mark

'[email protected]' =>Bob Logon,

Wenn ich nur a suche, sollte er mir jene Elemente zurückgeben, die a enthalten, zB:

'[email protected]' =>Mark Mian,

'[email protected]' =>John jack,

'[email protected]' =>Stela Josh,

'[email protected]' =>Bob Mark

Hinweis: Die Suche sollte durch Schlüssel oder Wert sein

+0

Sie verwenden können * * regex ** oder 'str_pos' dafür. Aber hast du irgendwas probiert? –

+2

Versuchen Sie es mit ['preg_grep'] (https://ideone.com/MNELWl) –

+0

*** Hinweis: Suche sollte durch oder Wert sein *** Dieser Tippfehler ist verwirrend. Bitte in Betracht ziehen, –

Antwort

5

Hier ist eine preg_grep Lösung, die wie ein WHERE REGEXP 'PATTERN' in MySQL arbeiten mehr sollte. Ich änderte Daniel Klein's preg_grep_keys function, um nach dem Muster innerhalb der Feldschlüssel zu suchen, und fügte ein array_merge zu ihm hinzu, welches mit den Feldern mit nichtnumerischen Schlüsseln arbeiten sollte. Wenn die Schlüssel numerisch sind, verwenden Sie einfach preg_grep solution (preg_grep('~Mark~i', $arr);, um alle Array-Elemente mit mark oder Mark usw. zu finden).

array_merge
fügt die Elemente aus einem oder mehreren Arrays zusammen, so dass die Werte des einen an das Ende des vorigen angehängt wird. Es gibt das resultierende Array zurück. Wenn die Eingabearrays dieselben Zeichenfolgenschlüssel haben, überschreibt der spätere Wert für diesen Schlüssel den vorherigen. Wenn die Arrays jedoch numerische Schlüssel enthalten, überschreibt der spätere Wert nicht den ursprünglichen Wert, sondern wird angehängt.

function preg_grep_keys_values($pattern, $input, $flags = 0) { 
    return array_merge(
     array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags))), 
     preg_grep($pattern, $input, $flags) 
    ); 
} 

$a = array(
    '[email protected]'=> "Mark Mian lv", 
    '[email protected]'=> "John jack lv", 
    '[email protected]'=> "Bob Logon", 
    '[email protected]'=> "Stela Josh", 
    '[email protected]'=> "Json Josh", 
    '[email protected]'=> "Bob Mark" 
); 

$r = preg_grep_keys_values('~lv~i', $a); 
print_r($r); 

Siehe this IDEONE demo

Der obige Code sucht lv (case-insensitively) in dem ersten Schlüssel, dann in den Werten, und verschmilzt dann die Ergebnisse in 1-Array. Somit sind die Ergebnisse:

[[email protected]] => John jack lv 
[[email protected]] => Bob Mark 
[[email protected]] => Mark Mian lv 
+1

Großer, Danke :) – Qazi

6
$needle="bob"; 
$output=array(); 
foreach($array as $k=>$v) 
{ 
    if(stristr($k,$needle) || stristr($v,$needle)) 
    $output[$k]=$v; 
} 
print_r($output); 

Fiddle

Das heißt, wenn Sie Schlüssel suchen möchten und Werte beide, entfernen Sie die Schlüssel Teil, wenn Sie nur Werte gesucht werden soll.

+0

Ich hätte anfangs eine leere $ Ausgabe definiert. –

+1

Nahm deinen Rat an :) –

+0

@HankyPanky Ich werde das untersuchen, was du über 'array_filter()' Funktion vorschlägst, würde es funktionieren? – Qazi

3

Ein würde leicht Ansatz array_filter

Wenn Sie regex die wollen, dies funktionieren würde

$regex = '~test~'; 
$result = array_filter($data, function($item) use ($regex) { 
    return preg_match($regex, $item); 
}); 

Oder nur eine einfache enthält Suche

$search = 'test'; 
$result = array_filter($data, function($item) use ($search) { 
    return stristr($value, $search); 
}); 

Wenn Sie zu benutzen, suchen haben Sowohl Schlüssel als auch Wert können Sie den Parameter ARRAY_FILTER_USE_BOTH an array_filter anhängen.

$search = 'test'; 
$result = array_filter($data, function($item, $key) use ($search) { 
    return stristr($value, $search) || stristr($key, $search); 
}, ARRAY_FILTER_USE_BOTH); 

Und schließlich könnten Sie array_filter mit preg_grep kombinieren, um beides gleichzeitig zu suchen.

$search = '~bob~i'; 
$result = array_filter($data, function() use ($search) { 
    return count(preg_grep($search, func_get_args())); 
}, ARRAY_FILTER_USE_BOTH); 
+0

oh ... mein Schlechter;) – Philipp

+1

Sorry ein mehr. Was ist mit "Bob"? +1 unabhängig –

+0

@HankyPanky Ich habe eine preg_grep Version hinzugefügt, die beide gleichzeitig sucht – Philipp

2

Sie möchten ein Array filtern, verwenden Sie array_filter, die ausgelegt ist. nur

Wenn Sie Literalzeichenfolgen suchen, die Sie nicht benötigen einen regulären Ausdruck verwenden:

$needle = 'bob'; 

$result = array_filter($data, function ($k, $v) use ($needle) { 
    return stripos($k, $needle) !== false || stripos($v, $needle) !== false; 
}, ARRAY_FILTER_USE_BOTH); 

Wenn Sie mit einem regulären Ausdruck filtern können, möchten:

$pattern = '~n.*e~i'; 

$result = array_filter($data, function ($k, $v) use ($pattern) { 
    return !empty(preg_grep($pattern, [$k, $v])); 
}, ARRAY_FILTER_USE_BOTH);