Tolwin: Hash Array durchsuchen

Hallo Zusammen,
ich habe eine Frage dessen Lösung mir nicht gelingen will.
Es gibt 2 Datenquellen - eine Datenbank und ein CSV File.
Der Inhalt des CSV setzt sich aus 3 Daten zusammen Bsp. 176,Pfadangabe.....,3. Die erste Stelle ist eine Kategorie ($cat_id),
die zweite wie beschrieben ($path) und die dritte dient zur Sortierung ($sort). Naürlich sind es mehrere Zeilen mit unterschiedlichen Inhalt. Diese lese ich per "split" in folgendes Array

$file ="muster2.csv";
$farray   =  file($file) or die("Fehler)");
if($farray)
{
   foreach($farray as $line)
   {
       list($cat_id, $path, $sort) = split(";", $line);
       $filehash[$cat_id]['cat_id'] = $cat_id;
       $filehash[$cat_id]['path']   = $path;
       $filehash[$cat_id]['sort']   = $sort;
    }
}

Diese Array möchte ich gerne durchsuchen und den Datensätzen aus der DB mit den passenden cat_id´s zuordnen (die gleiche ID kann mehrfach vorkommen) Dies versuche ich so:

foreach($results as $result)
{
    echo  "echo1<br>";
    $counti=0;

if (isset($filehash[$cat_id]))
    {
     echo $filehash[$cat_id]['cat_id']."<br>";
     if($filehash[$cat_id]['cat_id'] == $result->category_id)
 {
     echo "ich bin drin!<br>";
     $counti=1;
 }
     }
     elseif($counti == 0)
     {
 echo  "Ausgabe 1<br>";
     }

echo  "echo 2<br>";
}

Leider funktioniert es nicht... bin Einsteiger und habe da wohl einen Denkfehler. Mit foreach kann ich das Array ja nicht durchsuchen denke ich?!?!
Hoffe der viele Text erschlägt Euch nicht !

  1. Es gibt 2 Datenquellen - eine Datenbank und ein CSV File.
    Der Inhalt des CSV setzt sich aus 3 Daten zusammen Bsp. 176,Pfadangabe.....,3. Die erste Stelle ist eine Kategorie ($cat_id),

    Heißt das, dass die erste Spalte jeweils ein dateiweit eindeutiger Wert ist oder kann ein bestimmter Wert auch mehrfach auftreten?

    die zweite wie beschrieben ($path) und die dritte dient zur Sortierung ($sort). Naürlich sind es mehrere Zeilen mit unterschiedlichen Inhalt. Diese lese ich per "split" in folgendes Array

    $file ="muster2.csv";
    $farray   =  file($file) or die("Fehler)");
    if($farray)
    {
       foreach($farray as $line)
       {
           list($cat_id, $path, $sort) = split(";", $line);

    Zwei Dinge: Wenn du split() ohne regular expressions verwenden willst, solltest du lieber explode() nehmen. Das ist da schneller. Außerdem funktioniert dein split() nicht wie von dir gewünscht wenn das Semikolon innerhalb einer quotierten Zeichenfolge auftaucht wert1;"wert2 mit semikolon;...";wert3 Das mag zwar in deinem Fall nicht vorkommen, aber warum nicht gleich richtig machen? Es gibt da nämlich eine Funktion namens fgetcsv()

    $filehash = array();
    $handle = fopen ("muster2.csv", "r");
    while (($data = fgetcsv ($handle, 1000, ";")) !== FALSE) {
      if (count($data) < 3) continue; // oder halt was anderes passendes verwenden
      if (count($data) > 3) continue; // oder halt was anderes passendes verwenden
      ...
    }
    fclose ($handle);

    foreach($results as $result) {
      ...
    }

    Diese Array möchte ich gerne durchsuchen und den Datensätzen aus der DB mit den passenden cat_id´s zuordnen (die gleiche ID kann mehrfach vorkommen) Dies versuche ich so:

    Ich kann aus deinen Worten die Aufgabenstellung noch nicht erkennen. Was willst du am Ende für ein Ergebnis bekommen? Dein Code erzeugt im zweiten Teil nur ein paar Ausgaben. Die ...-Stellen in meinem Beispiel kann ich dir momentan nicht ausfüllen.

    Mit foreach kann ich das Array ja nicht durchsuchen denke ich?!?!

    foreach durchsucht nicht, es wendet einfach nur die nachfolgende Anweisung auf alle Elemente eines Arrays an. Diese Anweisung kann aber durchaus auch einen Vergleich enthalten...
    Ob bei die ein geschachteltes foreach (results außen und filehash innen) sinnvoll ist, kann ich dir momentan nicht sagen.

    1. Erst einmal vielen Dank für die Hilfe!
      In der CSV Dateien stehen Pfadangaben denen eine eindeutige cat_id zugeordent sind. In der DB sind News die ebenfalls diese cat_id haben, nur kommt diese hier mehrfach vor. Des Weitern habe ich einen
      Sortierungsparameter (1 - 6) im CSV damit ich Später die News denen die passenden cat_id zugeordnet wurde nach einer Hauptkategorie (1- 6) aufrufen bzw. sortieren kann. Mir ist nicht klar wie ich mit Foreach nun mit einer News und deren cat_id das Array durchsuche und den passenden Pfad ausgeben kann. Ich kenn foreach eigentlich nur mit $key und $value ... was ich hier aber m.E. nicht nutzen kann.
      Übrigens funktioniert der split einwandfrei, werde aber trotzdem Deinen VOrschlag befolgen und explode bzw. fgetcsv testen!
      Ich hoffe es ist jetzt etwas klarer geworden

      1. Übrigens funktioniert der split einwandfrei, werde aber trotzdem Deinen VOrschlag befolgen und explode bzw. fgetcsv testen!

        Es funktioniert immer alles einwandfrei, bis plötzlich etwas daherkommt, was man nicht bedacht hatte. Windows funktioniert auch einwandfrei ... und hat jede Menge Sicherheitslücken. Nein! Nein! Stopp! Aufhören! Ich wollte jetzt dazu keine Diskussion anzetteln. :-)

        Ich denke, jetzt hab ich dein Problem verstanden.

        Zu den ersten ... Punkten

        Ich ersetze erstmal das $filehash = array(); durch ein $kategorien = array();

        Bezeichne deine Variablen am besten immer nach deren Bedeutung, nicht nach deren Typ.
        Wenn du deinen Programm-Code später mal wieder anschaust siehst du an der Initialisierung, dass das ein Hash/Array ist, aber ob du dich dann noch an die Bedeutung erinnern kannst ...

        $kategorien[$data[0]] = array('path' => $data[1], 'sort' => $data[2]);

        cat_id brauchst du kein zweites Mal als Wert in $kategorien, das hast du ja schon als Key verwendet.

        Dann hast du ein Array mit Datensätzen aus der DB:

        foreach($results as $result) {
          if (array_key_exists($result->category_id, $kategorien))
            continue; // oder was weiß ich...

        // als Beispiel eine Nur-Lesen-Anwendung
          echo $kategorien[$result->category_id]['path'];
          echo $kategorien[$result->category_id]['sort'];
        }

        $result ist an dieser Stelle nur eine Kopie, die am Ende des Schleifendurchgangs wieder verworfen wird. (Allgemein gesagt: foreach arbeitet immer nur mit Kopien der Elemente.) Wenn du also an die Elemente in $results noch Daten hinzufügen oder diese ändern willst, musst du sie direkt ansprechen:

        foreach($results as $key => $result) {
          if (!array_key_exists($result->category_id, $kategorien))
            continue; // oder was weiß ich...

        $results[$key]->path = $kategorien[$result->category_id]['path'];
          $results[$key]->sort = $kategorien[$result->category_id]['sort'];
        }

        Das Sortieren geht dann so:

        function cmp($a, $b) {
          return $a->sort - $b->sort;
          // oder so, wenn die höheren Werte vorn stehen sollen:
          //return $b->sort - $a->sort;
        }

        usort($results, 'cmp');

        1. Vielen herzlichen Dank für die umfassende Info und die Mühe dir Du Dir gemacht hast!!! Danke! Viele Grüße
          Tolwin

          1. Eine Frage hätte ich jetzt doch noch.
            Wo wird den $cat_id in diesem Array definiert?

            $kategorien[$data[0]] = array('path' => $data[1], 'sort' => $data[2]);

            ???
            Nochmals Danke!

            1. Eine Frage hätte ich jetzt doch noch.
              Wo wird den $cat_id in diesem Array definiert?

              $kategorien[$data[0]] = array('path' => $data[1], 'sort' => $data[2]);

              Das hab ich direkt als Schlüssel für das Array $kategorien verwendet ($data[0]). Das noch mal als Wert mit aufzunehmen hab ich als überflüssig erachtet.

              Wenn man über $kategorien foreacht dann kommt man so ran:
              foreach($kategorien as $cat_id => $katData) {
                $cat_id ... $katData['path'] ... $katData['sort']

              Aber wenn du willst, kannst du das immer noch zusätzlich als Wert mit einbauen:
                $kategorien[$data[0]] = array('cat_id' => $data[0], 'path' => $data[1], ...

              1. Eine Frage hätte ich jetzt doch noch.
                Wo wird den $cat_id in diesem Array definiert?

                $kategorien[$data[0]] = array('path' => $data[1], 'sort' => $data[2]);

                Das hab ich direkt als Schlüssel für das Array $kategorien verwendet ($data[0]). Das noch mal als Wert mit aufzunehmen hab ich als überflüssig erachtet.

                Wenn man über $kategorien foreacht dann kommt man so ran:
                foreach($kategorien as $cat_id => $katData) {
                  $cat_id ... $katData['path'] ... $katData['sort']

                Aber wenn du willst, kannst du das immer noch zusätzlich als Wert mit einbauen:
                  $kategorien[$data[0]] = array('cat_id' => $data[0], 'path' => $data[1], ...

                Super, Dank Dir!!!

                1. Ich bin´s leider noch mal.
                  Habe folgendes jetzt in mein Skript übernommen:

                  $file = "muster2.csv";
                  $farray   =  file($file) or die("Fehler)");
                  if($farray)
                  {
                      foreach($farray as $line)
                      {
                   list($cat_id, $path, $sort) = split(";", $line);
                   $kategorien[$data[0]] = array('cat_id' => $data[0], 'path' => $data[1], 'sort' => $data[2]);
                      }
                  }

                  foreach($results as $result)
                  {
                     if(!array_key_exists($result->category_id, $kategorien))
                     {
                       echo "bin drin!";
                       foreach($kategorien as $cat_id => $katData)
                       {
                        echo "Key: " . $cat_id . " Value path: " . $katData['path'] . " Value sort: " . $katData['sort'] . "<br>";
                       }
                     }
                  }
                  ?>

                  Irgendwie wird mir aber das Array nicht befüllt... vorher ging es.