Überprüfen, ob ein Wert in einem Array vorkommt

Hallo,

kann ich auf einfache Weise überprüfen, ob ein Wert in einem Array vorkommt?
Es geht natürlich, in dem man einfach alle Werte des Arrays der Reihe nach durchläuft und bei jedem Wert überprüft, ob er übereinstimmt.
Wenn man aber viele Werte mit einem großen Array vergleichen will, dann werden das natürlich exorbitant viele Schleifendurchläufe. Darum würde ich nach einer besseren Lösung suchen.

Gruß

Thomas

Servus Thomas

Eigentlich hab ich keine Ahnung von PHP, aber wie wäre es evtl. mit der Funktion array_search?
http://www.selfphp.info/funktionsreferenz/array_funk…

Oder mit der Funktion in_array?
http://www.selfphp.info/funktionsreferenz/array_funk…

MfG
Roland

kann ich auf einfache Weise überprüfen, ob ein Wert in einem
Array vorkommt?
Es geht natürlich, in dem man einfach alle Werte des Arrays
der Reihe nach durchläuft und bei jedem Wert überprüft, ob er
übereinstimmt.
Wenn man aber viele Werte mit einem großen Array vergleichen
will, dann werden das natürlich exorbitant viele
Schleifendurchläufe. Darum würde ich nach einer besseren
Lösung suchen.

Grundlegend hat Roland recht. Will heißen: Du verwendest tatsächlich am besten die array_search Funktion.
Eine komplette Code-Referenz samt Online-Dokumentation findest du z.B. hier:
http://de.php.net/ (oben rechts ist ein Suchfeld)

Hast du allerdings sehr viele Daten in einem Array, also z.B. nur IDs (bzw. andere eindeutige Werte) würde ich dir empfehlen ein sog. assoziatives Array zu verwenden, um das Element dann so zu suchen:

if(isset($array[$value])){ echo "Wert gefunden!"; }

Einzige Voraussetzung:
Du musst das Array anders befüllen, z.B. so:

...
$array[$uniqueValue] = $someOtherData;
...

Wobei eben $uniqueValue die eindeutige ID und $someOtherData die eigentlichen Daten darstellen.

Für weitere Fragen stehe ich allerdings auch gerne zur Verfügung.

Liebe Grüße aus Augsburg,
Stephan Schulze

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Stephan,

Grundlegend hat Roland recht. Will heißen: Du verwendest
tatsächlich am besten die array_search Funktion.
Eine komplette Code-Referenz samt Online-Dokumentation findest
du z.B. hier:
http://de.php.net/ (oben rechts ist ein Suchfeld)

Die zweite Version ist sogar noch besser. Ich brauch ja nicht zu wissen, wo der Wert drin steckt, sondern einzig und allein, ob er drin steckt.

Hast du allerdings sehr viele Daten in einem Array, also z.B.
nur IDs (bzw. andere eindeutige Werte) würde ich dir empfehlen
ein sog. assoziatives Array zu verwenden, um das Element dann
so zu suchen:

if(isset($array[$value])){ echo „Wert gefunden!“; }

Einzige Voraussetzung:
Du musst das Array anders befüllen, z.B. so:


$array[$uniqueValue] = $someOtherData;

Wobei eben $uniqueValue die eindeutige ID und
$someOtherData die eigentlichen Daten darstellen.

Für weitere Fragen stehe ich allerdings auch gerne zur
Verfügung.

So ungefähr habe ich es jetzt auch gelöst. Ich gehe zuerst her und verwende den Befehl

array\_flip()

, um den Index mit dem Inhalt zu vertauschen, da der eigentliche Index des Arrays eh nur eine fortlaufende Zahl ist. Anschließend überprüfe ich mit

if(isset($array[$value]))

, ob ein Element mit diesem Index existiert. Eiegntlich ganz einfach. Trotzdem hatte ich da fast einen kompletten Tag getüftelt um da drauf zu kommen.

Gruß

Thomas

Hallo Stephan,

[…]

Die zweite Version ist sogar noch besser. Ich brauch ja nicht
zu wissen, wo der Wert drin steckt, sondern einzig und allein,
ob er drin steckt.

[…]

So ungefähr habe ich es jetzt auch gelöst. Ich gehe zuerst her
und verwende den Befehl

array_flip()

, um den Index
mit dem Inhalt zu vertauschen, da der eigentliche Index des
Arrays eh nur eine fortlaufende Zahl ist. Anschließend
überprüfe ich mit

if(isset($array[$value]))

, ob ein
Element mit diesem Index existiert. Eiegntlich ganz einfach.
Trotzdem hatte ich da fast einen kompletten Tag getüftelt um
da drauf zu kommen.

Gruß

Thomas

Das mit dem ganzen Tag macht nichts. Jeder fängt mal an :smile:

Aber man könnte das Array auch gleich andersherum befüllen. Dann würde man sich auch gleich noch den recht zeitaufwendigen array_flip() schenken.

Liebe Grüße,
Stephan Schulze

Hallo Stephan,

Das mit dem ganzen Tag macht nichts. Jeder fängt mal an :smile:

tja, leider. Nur verliert man immer jede Menge Zeit und genau das ist es, was ich bei diesem Projekt leider nicht unbegrenzt habe.

Aber man könnte das Array auch gleich andersherum befüllen.
Dann würde man sich auch gleich noch den recht zeitaufwendigen
array_flip() schenken.

Ich befürchte nein. Das Array befüllt sich nämlich selbst durch ein Formular mit Checkboxen. Wenn ich da eine andere Lösung dafür finden würde, wäre ich sehr zufrieden.

Gruß

Thomas

Hallo Stephan,

Das mit dem ganzen Tag macht nichts. Jeder fängt mal an :smile:
Aber man könnte das Array auch gleich andersherum befüllen.
Dann würde man sich auch gleich noch den recht zeitaufwendigen
array_flip() schenken.

Ich befürchte nein. Das Array befüllt sich nämlich selbst
durch ein Formular mit Checkboxen. Wenn ich da eine andere
Lösung dafür finden würde, wäre ich sehr zufrieden.

Ich verstehe ehrlich gesagt nicht genau,
wovon ihr redet. Wie gross sind denn diese
Arrays?

In PHP gibt es eigentlich gar keine Arrays
im „herkömmlichen Sinne“, ein scheinbares
„Array“ a = Array( ‚a‘, ‚b‘, ‚c‘, ‚d‘ ) ist
ja tatsächlich ein assoziatives Array mit
„Zahlen“ als Keys: a = Array (
‚0‘ => ‚a‘
‚1‘ => ‚b‘
‚2‘ => ‚c‘
‚3‘ => ‚d‘
);Ich habe mal ein Array der Größe 10^6 (memory_limit=256M)
mit je 4 Zeichen als ‚value‘ testweise erzeugt: $numelem = 1000000; # generate huge array
$testar1 = array();
$chrincr = ‚AAAA‘;

$start = microtime_float();
for( $i=0,$j = $chrincr; $idas läuft hier in

 Start:AAAA (index:0)
 End: BEXHO (index: 1000000) 
 **in 1.086 sec**

durch. Das Array zu ‚flippen‘

 print 'key value flip 
';
 $start = microtime\_float();
 $testar2 = array\_flip($testar1);
 $end = microtime\_float() - $start;

dauert dann

 key value flip
 done in 0.789 sec

Wird das Array ‚in place‘ ge-flippt,
also nicht in ein anderes Array,

 print 'inplace key value flip 
';
 $start = microtime\_float();
 $testar2 = array\_flip($testar2);
 $end = microtime\_float() - $start;

dauert der Spass:

 inplace key value flip
 done in 0.554 sec

(unter SuSE 10.2 in vmware auf einem
Windows-XP-Rechner Athlon 3400+)

Hat das Array „nur“ 10,000 Elemente,
ist die „Zeit“ für die gesamte obige Prozedur
nahezu nicht bemerkbar

 array test
 Start:AAAA (index:0)
 End: AOUQ (index: 10000)
 in 0.031 sec
 key value flip
 done in 0.018 sec
 inplace key value flip
 done in 0.010 sec

Daher meine Frage.

Grüße

CMБ

Ich verstehe ehrlich gesagt nicht genau,
wovon ihr redet. Wie gross sind denn diese
Arrays?

In PHP gibt es eigentlich gar keine Arrays
im „herkömmlichen Sinne“, ein scheinbares
„Array“ a = Array( ‚a‘, ‚b‘, ‚c‘, ‚d‘ ) ist
ja tatsächlich ein assoziatives Array mit
„Zahlen“ als Keys: a = Array (
‚0‘ => ‚a‘
‚1‘ => ‚b‘
‚2‘ => ‚c‘
‚3‘ => ‚d‘
);Ich habe mal ein Array der Größe 10^6
(memory_limit=256M)
mit je 4 Zeichen als ‚value‘ testweise erzeugt:
$numelem = 1000000; # generate huge array
$testar1 = array();
$chrincr = ‚AAAA‘;

$start = microtime_float();
for( $i=0,$j = $chrincr; $idas läuft hier in

Start:AAAA (index:0)
End: BEXHO (index: 1000000)
in 1.086 sec

durch. Das Array zu ‚flippen‘

print 'key value flip
';
$start = microtime_float();
$testar2 = array_flip($testar1);
$end = microtime_float() - $start;

dauert dann

key
value flip
done in 0.789 sec

Wird das Array ‚in place‘ ge-flippt,
also nicht in ein anderes Array,

print 'inplace key
value flip
';
$start = microtime_float();
$testar2 = array_flip($testar2);
$end = microtime_float() - $start;

dauert der
Spass:

inplace key value flip
done in 0.554 sec

(unter SuSE 10.2 in vmware auf einem
Windows-XP-Rechner Athlon 3400+)

Hat das Array „nur“ 10,000 Elemente,
ist die „Zeit“ für die gesamte obige Prozedur
nahezu nicht bemerkbar

array test
Start:AAAA (index:0)
End: AOUQ (index: 10000)
in 0.031 sec
key value flip
done in 0.018 sec
inplace key value flip
done in 0.010 sec

Daher meine Frage.

Grüße

CMБ

Hallo,

erst einmal herzlichen Dank für deine ausführlichen Beschreibungen.
Ich schrieb es deswegen, dass man - je nach dem wie man ein Array befüllt - auch gleich darauf achten kann einen Index aufzubauen, z.B.:

$array[$value] = "1";

statt

array\_push($array, $value);
...
array\_flip();

Auch konnte ich nicht wissen, dass es sich bei diesem Array um ein derart kleines Array handelt, wie Thomas schrieb, da ich nicht annehme, dass die entsprechende Webseite mehrere Millionen Checkboxen enthält.

Würde es sich dabei um eine Datenbank handeln, sähe die Sache wieder anders aus.

Liebe Grüße,
Stephan

Hallo,

ich mal auch mal mit dem Timing experimentiert…

$a = Array();
$j=0;
$strcnt="AAA";
for($i=0;$i

gibt bei mir
flip & isset:0.023425
in_array:0.009961

in_array ist also schneller als der Zugriff per Index auf das geflippte Array. Daher würde ich mal in_array als Alternative vorschlagen :wink:

Alex