Robert-Green: in einem mehrdimensionalen Array Count auf einen bestimmten Wert

Uhi das klingt schon wieder kompliziert. Ich versuche mich mal an einer Beschreibung. Also ich habe ein Array $result. $result ist mehrdimensional.

Beispiel:~~~php

$result = array(
          array( 'TIR', 'Tires', 2 ),
          array( 'OIL', 'Oil', 10 ),
          array( 'SPK', 'Spark Plugs', 2 )
          array( 'OIL', 'Oil', 10 ),
          array( 'SPK', 'Spark Plu', 2 )
          array( 'OIL', 'O', 10 ),
          array( 'SPK', 'Spark Pl', 2 )
);

  
Ich habe nun die Frage, wie oft kommt an der $result[X][3] zb. die Zahl 2 vor. (X Steht für den Zähler im Array) In diesem Beispiel sollte das Ergebnis 4 lauten.  
  
Ich hatte gedacht das count hier eine gute Lösung wäre, aber ich habe keine WHERE definiton gefunden. Gibt es andere Lösungen?  
  
Danke  
  
Robert-Green
  1. Hello,

    War das eine Scherzfrage?

    Uhi das klingt schon wieder kompliziert. Ich versuche mich mal an einer Beschreibung. Also ich habe ein Array $result. $result ist mehrdimensional.

    Beispiel:~~~php

    $result = array(
                     array( 'TIR', 'Tires', 2 ),
                     array( 'OIL', 'Oil', 10 ),
                     array( 'SPK', 'Spark Plugs', 2 )
                     array( 'OIL', 'Oil', 10 ),
                     array( 'SPK', 'Spark Plu', 2 )
                     array( 'OIL', 'O', 10 ),
                     array( 'SPK', 'Spark Pl', 2 )
                   );

    
    >   
    > Ich habe nun die Frage, wie oft kommt an der $result[X][3] zb. die Zahl 2 vor. (X Steht für den Zähler im Array) In diesem Beispiel sollte das Ergebnis 4 lauten.  
      
    Das Unterarray hat überhaupt keine Elemente mit dem Index [3]!  
      
      
      
      
      
      
    Wenn Du solche Arrays aufbauen willst, um damit zu arbeiten (addieren, zählen, Mittelwert bilden, ...), dann bau sie anders herum auf.  
      
    $\_result = array();  
      
    $\_result['abbr']  = array();  
    $\_result['descr'] = array();  
    $\_result['qtty']  = array();  
      
    $\_result['abbr'][1] = 'TIR';   ## Ich fange hier jetzt mal bewusst bei 1 an zu zählen  
    $\_result['abbr'][2] = 'OIL';  
    ...  
      
    $\_result['descr'][1] = 'Tires';  
    $\_result['descr'][2] = 'Oil';  
    ...  
      
    $\_result['qtty'][1]  = 2;  
    $\_result['qtty'][2]  = 10;  
      
      
    und siehe meinen angefangenen Artikel im Wiki dazu  
    <http://wiki.selfhtml.org/wiki/Artikel:PHP/Arrays_mal_anders_herum>  
    Dort findest Du universelle Funktionen, um dein satzorientiertes Array in ein spaltenorientiertes umzubauen.  
      
    Anchließend kannst du mit den Spalten alle Berechnungen mit Standard-Arrayfunktionen von PHP durchführen.  
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. Hi.

      Uhi das klingt schon wieder kompliziert. Ich versuche mich mal an einer Beschreibung. Also ich habe ein Array $result. $result ist mehrdimensional.

      Nein, result ist nicht mehrdimensional - ein Array in PHP ist nie mehrdimensional. result ist ein Array, dessen Felder halt wieder Arrays sind.

      Ich habe nun die Frage, wie oft kommt an der $result[X][3] zb. die Zahl 2 vor. (X Steht für den Zähler im Array) In diesem Beispiel sollte das Ergebnis 4 lauten.

      Die Aufgabe wird ca. ein Dreizeiler etwa mit der Funktion array_reduce.

      Wenn Du solche Arrays aufbauen willst, um damit zu arbeiten (addieren, zählen, Mittelwert bilden, ...), dann bau sie anders herum auf.

      $_result = array();

      $_result['abbr']  = array();
      $_result['descr'] = array();
      $_result['qtty']  = array();

      Warum? Um dann 'multi' -sort, -add, -sonstwas machen zu müssen?

      und siehe meinen angefangenen Artikel im Wiki dazu
      http://wiki.selfhtml.org/wiki/Artikel:PHP/Arrays_mal_anders_herum
      Dort findest Du universelle Funktionen, um dein satzorientiertes Array in ein spaltenorientiertes umzubauen.

      Dein Artikel in Ehren, Tom, wenn es ne Fingerübung sein soll. Aber wenn Du so eine Array-Organisation Leuten ernsthaft für die Praxis empfiehlst, dann macht mir das ziemliche Bauchschmerzen.

      Viele Grüße,
      der Bademeister

      1. Hello,

        Uhi das klingt schon wieder kompliziert. Ich versuche mich mal an einer Beschreibung. Also ich habe ein Array $result. $result ist mehrdimensional.

        Nein, result ist nicht mehrdimensional - ein Array in PHP ist nie mehrdimensional. result ist ein Array, dessen Felder halt wieder Arrays sind.

        Diese Diskussion können wir uns sparen.
        Man kann sich Arrays in PHP als Baumstrukturen vorstellen. Datenkonstrukte, die Listen in Listen enthalten, werden nach einschlägoger Literatur auch als Bäume bezeichnet.

        Wie das Ganze intern aufgebaut ist, geht uns als PHP-Programmierer erstmal nichts an (auch wenn es durchaus interessant ist).

        Ich habe nun die Frage, wie oft kommt an der $result[X][3] zb. die Zahl 2 vor. (X Steht für den Zähler im Array) In diesem Beispiel sollte das Ergebnis 4 lauten.

        Die Aufgabe wird ca. ein Dreizeiler etwa mit der Funktion array_reduce.

        Und wo ist dein Beispiel?

        Ich würde hier trotzdem eine Schleife mit foreach() nehmen, wenn ich den Aufbau so lassen wollte.

        Wenn Du solche Arrays aufbauen willst, um damit zu arbeiten (addieren, zählen, Mittelwert bilden, ...), dann bau sie anders herum auf.

        $_result = array();

        $_result['abbr']  = array();
        $_result['descr'] = array();
        $_result['qtty']  = array();

        Warum? Um dann 'multi' -sort, -add, -sonstwas machen zu müssen?

        Lies die vielen Threads im Archiv zu diesem Thema, bevor Du meine Hinweise ignorierst.

        und siehe meinen angefangenen Artikel im Wiki dazu
        http://wiki.selfhtml.org/wiki/Artikel:PHP/Arrays_mal_anders_herum
        Dort findest Du universelle Funktionen, um dein satzorientiertes Array in ein spaltenorientiertes umzubauen.

        Dein Artikel in Ehren, Tom, wenn es ne Fingerübung sein soll. Aber wenn Du so eine Array-Organisation Leuten ernsthaft für die Praxis empfiehlst, dann macht mir das ziemliche Bauchschmerzen.

        Mir nicht.

        Mir macht nur Deine Art wieder Bauchschmerzen. Lies dich erstmal ein und überwinde deine antrainierte (?) Einstellung zur Datenorganisation.

        Daten sollten immer so organisiert werden, wie man sie am besten und billigsten verarbeiten kann. Dazu gehören natürlich auch bereits vorhandene, leicht verständliche Funktionen, die PHP dafür bietet.

        Dein Post zeigt mir jedenfalls, dass Du nicht wirklich mitdenken willst. Das finde ich schade.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi Tom.

          Nein, result ist nicht mehrdimensional - ein Array in PHP ist nie mehrdimensional. result ist ein Array, dessen Felder halt wieder Arrays sind.

          Diese Diskussion können wir uns sparen.
          Man kann sich Arrays in PHP als Baumstrukturen vorstellen. Datenkonstrukte, die Listen in Listen enthalten, werden nach einschlägoger Literatur auch als Bäume bezeichnet.

          Ja, es ist auch unter Umständen durchaus legitim, Arrays als mehrdimensional zu bezeichnen, wenn man weiß, was man tut. Insofern sollte das gar keine "Zurechtweisung" von mir sein (hätte ich offenbar dranschreiben sollen), sondern in diesem Fall eine Hilfestellung. In diesem Falle hilft es nämlich nicht, von einem mehrdimensionalen Array zu sprechen. Grund:

          Der OP hat ein (eindimensionales) Array, und was er möchte, ist die Anzahl der Felder, die ein bestimmtes Kriterium erfüllen. Ganz einfach. Schaut er aber auf ein mehrdimensionales Array (d.h. die Felder in seinem Sinne wären die Felder der Unterarrays des äußeren Arrays), wird die Aufgabenstellung schwieriger. Unnötigerweise.

          Die Aufgabe wird ca. ein Dreizeiler etwa mit der Funktion array_reduce.

          Und wo ist dein Beispiel?

          Existiert nicht. Sollte der OP eines wollen, kommt es gerne nach. Ist das problematisch?

          Warum? Um dann 'multi' -sort, -add, -sonstwas machen zu müssen?

          Lies die vielen Threads im Archiv zu diesem Thema, bevor Du meine Hinweise ignorierst.

          ?? Ich ignorier sie doch gar nicht.

          Mir macht nur Deine Art wieder Bauchschmerzen. Lies dich erstmal ein und überwinde deine antrainierte (?) Einstellung zur Datenorganisation.

          Sorry, ich wollte Dir hier nicht blöd kommen (und glaube auch, nicht unfreundlich gewesen zu sein).

          Mir mangelt es hier nicht am Einlesen - Deinen Artikel habe ich auch gelesen. Ich glaube ganz gut zu wissen, wofür und wogegen ich hier argumentiere. Du willst in Deinem Artikel mit "Records" arbeiten; aber anstatt die Records in einem Array zu speichern, zerstückelst Du sie und brauchst mehrere händische Funktionen, um Manipulationen machen zu können, die Du mit einer anderen Datenstruktur praktisch für umme kriegst. Das ist nicht empfehlenswert.

          Dein Post zeigt mir jedenfalls, dass Du nicht wirklich mitdenken willst. Das finde ich schade.

          Was soll die Aussage? Woran habe ich denn nicht gedacht?

          Viele Grüße,
          der Bademeister

          1. Hello,

            Mir mangelt es hier nicht am Einlesen - Deinen Artikel habe ich auch gelesen. Ich glaube ganz gut zu wissen, wofür und wogegen ich hier argumentiere. Du willst in Deinem Artikel mit "Records" arbeiten; aber anstatt die Records in einem Array zu speichern, zerstückelst Du sie und brauchst mehrere händische Funktionen, um Manipulationen machen zu können, die Du mit einer anderen Datenstruktur praktisch für umme kriegst. Das ist nicht empfehlenswert.

            Dann hast Du das Ziel noch nicht verstanden.
            Ich "zerstückel" da gar nichts. Ich organisiere nur die Daten anders. Das ermöglicht dem Programmierer, die vorhandenen Array-Funktionen von PHP auf jede Spalte anzuwenden.

            Im Wiki wird das Anliegen wahrscheinlich erst deutlich, wenn ich die Beispiele eingestellt habe. Das dauert aber leider noch ein wenig, weil ich mit meinem Host noch gegen Windmühlen reite und den Übeltäter einfach nicht finde!

            Im Archiv gibt es aber schon Dutzende von Beispielen von mir dazu.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
        2. Hi!

          Nein, result ist nicht mehrdimensional - ein Array in PHP ist nie mehrdimensional. result ist ein Array, dessen Felder halt wieder Arrays sind.
          Diese Diskussion können wir uns sparen.
          Man kann sich Arrays in PHP als Baumstrukturen vorstellen. Datenkonstrukte, die Listen in Listen enthalten, werden nach einschlägoger Literatur auch als Bäume bezeichnet.
          Wie das Ganze intern aufgebaut ist, geht uns als PHP-Programmierer erstmal nichts an (auch wenn es durchaus interessant ist).

          Nicht der innere Aufbau ist interessant sondern das was nach außen hin zu sehen ist. Und das ist, wenn man richtig hinsieht, ein Array, dessen Elemente Arrays sind. Wenn man nun aus diesen inneren Arrays etwas haben will, muss man durch das außere Array laufen und dabei von jedem einzelnen inneren Array den entsprechenden Wert verarbeiten.

          Anzunehmenderweise kommen die Daten des OPs bereits in der gezeigten Form an. Wenn man nur eine Berechnung damit anstellen will, schreibt man sich besser den Dreizeiler passend für die gegebene Form, als erst die Daten umzusortieren und dann mit einer nur wenig anderen Form des Durchlaufens die Daten zu ermitteln. Es stimmt schon, dass man auf ein so genanntes Spalten-Array Funktionen wie array_sum() oder ähnliche sehr einfach anwenden kann, aber mit nur wenig mehr Aufwand kann man auch beim Zeilen-Array sein Ziel erreichen. Wenn die Aufgabenstellung komplexer wird, und man die vorgefertigten Funktionen nicht mehr verwenden kann, unterscheiden sie die Zu-Fuß-Lösungen beider Organisationsformen auch nciht wesentlich voneinander.

          Das Spalten-Array ist eine interessante Alternative zum Zeilen-Array, aber es wird im klassischen PHP-Umfeld kaum wirkliche Anwendungsfälle dafür geben. Die Daten kommen meist üblicherweise in Zeilen-Form aus den Datenhaltungen und werden nicht sehr oft mehr als einmal iteriert. Am Requestende wird sowieso wieder alles verworfen, so dass ein Umsortieren nur Mehraufwand darstellt, den man durch die etwas einfachere Datenzusammenfassbarkeit oder Sortierfähigkeit nicht wieder rausholen kann. Es lohnt sich daher für solche in der Regel einfachen Fälle kaum, ernsthaft über Spalten-Arrays nachzudenken.

          Lo!