[PHP] Array Durchsuchen

timo_hildebrand

VFB Fan oO
ID: 107555
L
21 April 2006
1.072
92
Hi, ich möchte ein Array durchsuchen. Jedoch möchte ich suchen, ob innerhalb eines Datensatzes ein Stringfetzen enthalten ist.
Beispiel:
PHP:
<?php
$array=array("abcde", "fghi", "jkkals");

jetzt möchte ich den Wert "1" zurückgeliefert bekommen, wenn ich nach "gh" suche. Ist das ohne eine Schleife möglich?
 
Willst du 1 haben, weil gh im zweiten, also 1 nummerierten Eintrag steht oder 1, weil es generell im Array vorkommt? Bei zweiterem wäre folgendes möglich, wenn du definitiv keine Schleife willst.

PHP:
$erg = (strpos(implode('_+_', $array), $suche) !== FALSE) ? TRUE : FALSE;

Aber selbst wenn man das in nicht nur eine Zeile schreibt ist es unschön. Warum also keine Schleife nehmen?
 
mhm, also ich würde wirklich lieber ne foreach-Schleife nehmen und da drin dann mit net Stringfunktion suchen...wieso sollte man es sich aber einfach machen, wenn es auch schwer geht? :p
 
Ist das ohne eine Schleife möglich?
Betrachte es doch mal logisch: Nein, niemals !

Wie willst du mit O(1) (konstantem Aufwand) ein beliebig langes Array durchsuchen ? Erschwerend kommt hinzu, dass du nach einem Mittelstück im String suchen willst.

Die simpleste Lösung, die mir einfallen würde, wär
PHP:
$array=array(...);
$search_part="foo";
foreach($array as $key=>$string)
  if(strpos($string,$search_part)!==false)
    echo "match found: \$array['$key']=$string\n";
.
 
@tH: Doch, es geht. Hab zwar mein Scriptstück nicht getestet, aber das sollte funktionieren. Aber das ist eher die Lösung für Programmierer "mit Skill", wie jetzt sicher jemand behaupten würde, dessen Nick mit "ch" beginnt.. Wer Schleifen benutzt ist schließlich ein Noob und verschwendet sinnlos Speicher für die Schleifenvariable :LOL:

Natürlich ist die Schleifen-Variante zu bevorzugen, aber nicht gehen stimmt auch nicht. ;)
 
@tH: Doch, es geht. Hab zwar mein Scriptstück nicht getestet, aber das sollte funktionieren. Aber das ist eher die Lösung für Programmierer "mit Skill", wie jetzt sicher jemand behaupten würde, dessen Nick mit "ch" beginnt.. Wer Schleifen benutzt ist schließlich ein Noob und verschwendet sinnlos Speicher für die Schleifenvariable :LOL:

Natürlich ist die Schleifen-Variante zu bevorzugen, aber nicht gehen stimmt auch nicht. ;)

ja absoluter noob... als vollprofi macht man das natürlich so :ugly:
PHP:
ob_start();
var_dump(array);
$temp = ob_get_content();
ob_end_clean();
preg_match("~\[(.*)\].*suchstring~",$temp,$index);
 
PHP:
$erg = (strpos(implode('_+_', $array), $suche) !== FALSE) ? TRUE : FALSE;
Iuh, was ist das denn? Wozu da den trinären Operator? Um true auf true bzw. false auf false zu mappen? :think:

Ich würde da auch eher auf eine Lösung zurückgreifen, die ohne Schleifen auskommt:
PHP:
<?php
	function array_find($haystack, $needle)
	{
		$iterator = create_function('$item', 'return strpos($item, \''.$needle.'\')!==false;');
		return array_filter($haystack, $iterator);
	}

	function array_contains($haystack, $needle)
	{
		$iterator = create_function('$value, $item', 'return $value or strpos($item, \''.$needle.'\')!==false;');
		return array_reduce($haystack, $iterator, false);
	}

	$needle = 'foo';
	$array = Array('affe', 'barfoos', 'cherry', 'dilemma', 'eisberg', 'fastfood');
	printf('Das Array enthält irgendwo den String "%s": [%s]<br/>', $needle, array_contains($array, $needle) ? 'X' : '-');
	printf('Die folgenden Elemente enthalten den String "%s": [%s]<br/>', $needle, implode(',', array_find($array, $needle)));
?>
Nicht wirklich intuitiv, dafür schön schlank.