Mons: In Multiarray suchen (optimale Variante für Performance)

Hallo,

ich habe eine Performancefrage, für folgenden Fall in PHP. Ich habe zwei Arrays: $array_1_suchwoerter = array('flasche', 'blume');

$array_2_index = array ( 
array('titel' => 'apfel', 'desc' => 'Hier ein schöner Beschreibungstext', 'url' => 'https://excample.com', 'img' => '/wp-content/uploads/2015/02/300x300.png', 'id' => '438'),
array('titel' => 'flasche', 'desc' => 'Hier ein schöner Beschreibungstext 2', 'url' => 'https://excample.com', 'img' => '/wp-content/uploads/2015/03/300x300.png', 'id' => '3438');

Die Suchwörter ($array_1_suchwoerter) sollen im jeweiligen index ($array_2_index [titel]) gefunden werden.

Ist es jetzt effizient zwei ineinander verschachtelte Foreachanfragen zu machen?

foreach($array_1_suchwoerter as $meine_suche){
	foreach($array_2_index as $mein_datensatz){
		if (isset($mein_datensatz['titel'])) {
			if ($mein_datensatz['titel'] == $meine_suche) {
				echo $mein_datensatz['titel'].' - '.$mein_datensatz['url'].'<br />';
			}
		}
	}
}

Irgendwie macht mir das Bauchschmerzen. Aber eine andere Idee habe ich nicht. Was meint Ihr?

  1. Tach!

    Ist es jetzt effizient zwei ineinander verschachtelte Foreachanfragen zu machen?

    Solange du keinen separaten Index pflegst, auf den man mit array_search() zumindest etwas schneller zugreifen kann, sehe ich da keine Möglichkeiten. Noch besser wäre es, einen sortierten Index zu haben, denn dann kann man spezielle Suchverfahren einsetzen, die nicht über die gesamte Datenmenge laufen müssen. Allerdigs hat PHP keine solche Funktionalität. Das Nachbauen mit PHP-Code lohnt sich vermutlich erst ab sehr großen Datenmengen, sonst wird es vermutlich eher langsamer.

    Irgendwie macht mir das Bauchschmerzen. Aber eine andere Idee habe ich nicht. Was meint Ihr?

    Mir bereitet eher Bauchschmerzen, dass da Verarbeitung und Ausgabe gemischt sind. Stattforeach mit Ausgabe beim Finden würde ich array_filter() verwenden, um damit die Ergebnismenge zu erstellen und dann getrennt darüber laufen, um die Ausgabe zu erzeugen.

    dedlfix.

  2. Hallo Mons,

    spricht etwas gegen folgenden Ansatz? Du musst dein Index-Array dann nur etwas anders aufbauen, und darfst keine Duplikate bei den Titeln haben. Statt Array() habe ich die [] Schreibweise gewählt - ist kompakter...

    // Layout des array_2_index Array:
    $array_2_index = [
       'apfel' =>   [ 'desc' => 'Hier ein schöner Beschreibungstext',
                      'url' => 'https://excample.com', 
                      'img' => '/wp-content/uploads/2015/02/300x300.png',
                      'id' => '438' ],
       'flasche' => [ 'desc' => 'Hier ein schöner Beschreibungstext 2',
                      'url' => 'https://excample.com',
                      'img' => '/wp-content/uploads/2015/03/300x300.png',
                      'id' => '3438' ]
    ];
    
    // Direkter Zugriff statt sequenzieller Suche:
    foreach($array_1_suchwoerter as $meine_suche) {
       if (array_key_exists($meine_suche, $array_2_index)) {
          $mein_datensatz = $array_2_index[$meine_suche];
          echo $meine_suche.' - '.$mein_datensatz['url'].'<br />';
       }
    }
    

    Rolf

    --
    Dosen sind silbern
    1. Hammer, super idee...