- Ad -
IMPRESSUM dotted_line KONTAKT dotted_line search dotted_line Contact dotted_line sitemap
370 PHP-Resource Mitglieder online


php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Blogs > AmicaNoctis
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

Bewerten

Gruppenwechsel in PHP

"Gruppenwechsel in PHP" bei Mister Wong speichern "Gruppenwechsel in PHP" bei YiGG.de speichern "Gruppenwechsel in PHP" bei Google speichern "Gruppenwechsel in PHP" bei del.icio.us speichern "Gruppenwechsel in PHP" bei Digg speichern "Gruppenwechsel in PHP" bei icio.de speichern "Gruppenwechsel in PHP" bei My Yahoo speichern
Veröffentlicht: 03-06-2010 um 03:13 von AmicaNoctis

Da das Thema Gruppenwechsel immer mal wieder im Forum auftaucht, will ich an dieser Stelle mal einen lächerlich einfachen Ansatz vorstellen und erklären.

Wenn man eine Abfrage über mehrere Datenbanktabellen durchführt, erhält man fast immer eine Ergebnismenge in der Daten mehrfach vorkommen, die zwar in der Tabelle aus der sie stammen eindeutig sind, durch die Verknüpfung mit anderen Tabellen jedoch mehrfach in verschiedenen Kombinationen erscheinen. Ein Beispiel:

Code:
+---------------------------------------------------------+
| table: revision                                         |
+----+------------+--------+---------------------+--------+
| id | table_fkey | row_id | time                | type   |
+----+------------+--------+---------------------+--------+
|  1 |          1 |   NULL | 2010-03-03 09:20:30 | insert |
|  2 |          1 |      1 | 2010-03-03 09:20:30 | update |
|  3 |          1 |      1 | 2010-03-03 09:20:30 | update |
|  4 |          1 |   NULL | 2010-03-03 09:20:30 | insert |
|  5 |          1 |      2 | 2010-03-03 09:20:30 | update |
|  6 |          1 |      2 | 2010-03-03 09:20:31 | update |
|  7 |          1 |      1 | 2010-03-03 09:20:31 | update |
|  8 |          1 |      2 | 2010-03-03 09:20:31 | update |
|  9 |          1 |   NULL | 2010-03-03 09:20:31 | insert |
| 10 |          1 |      3 | 2010-03-03 09:20:31 | update |
:    :            :        :                     :        :
+----+------------+--------+---------------------+--------+

+-------------------------------------------------------------------+
| table: change                                                     |
+----+-------------+---------------+--------------------+-----------+
| id | column_fkey | revision_fkey | new_value          | old_value |
+----+-------------+---------------+--------------------+-----------+
|  1 |           1 |             1 | 1                  | NULL      |
|  2 |           2 |             1 | 2                  | NULL      |
|  3 |           3 |             1 | NULL               | NULL      |
|  4 |           4 |             1 |                    | NULL      |
|  5 |           3 |             2 | phpstaruml         | NULL      |
:    :             :               :                    :           :
| 13 |           2 |             7 | 4                  | 2         |
| 14 |           1 |             8 | 2                  | 3         |
| 15 |           2 |             8 | 3                  | 4         |
| 16 |           1 |             9 | 5                  | NULL      |
| 17 |           2 |             9 | 6                  | NULL      |
| 18 |           3 |             9 | NULL               | NULL      |
| 19 |           4 |             9 |                    | NULL      |
| 20 |           3 |            10 | AssociationTag.php | NULL      |
:    :             :               :                    :           :
+----+-------------+---------------+--------------------+-----------+
Die Abfrage

Code:
select
	revision.id as rev_id,
	revision.row_id,
	revision.type,
	`change`.id as chg_id,
	`change`.new_value,
	`change`.old_value,
from `change`
join revision on revision.id = change.revision_fkey;
liefert dann jeden revision-Datensatz mehrfach, wenn ihm mehrere change-Datensätze zugeordnet sind:

Code:
+--------+--------+--------++--------+--------------------+-----------+
| rev_id | row_id | type   || chg_id | new_value          | old_value |
+--------+--------+--------++--------+--------------------+-----------+
|      1 |   NULL | insert ||      1 | 1                  | NULL      |
|      1 |   NULL | insert ||      2 | 2                  | NULL      |
|      1 |   NULL | insert ||      3 | NULL               | NULL      |
|      1 |   NULL | insert ||      4 |                    | NULL      |
|      2 |      1 | update ||      5 | phpstaruml         | NULL      |
:        :        :        ::        :                    :           :
|      7 |      1 | update ||     13 | 4                  | 2         |
|      8 |      2 | update ||     14 | 2                  | 3         |
|      8 |      2 | update ||     15 | 3                  | 4         |
|      9 |   NULL | insert ||     16 | 5                  | NULL      |
|      9 |   NULL | insert ||     17 | 6                  | NULL      |
|      9 |   NULL | insert ||     18 | NULL               | NULL      |
|      9 |   NULL | insert ||     19 |                    | NULL      |
|     10 |      3 | update ||     20 | AssociationTag.php | NULL      |
:        :        :        ::        :                    :           :
+--------+--------+--------++--------+--------------------+-----------+
In der Ausgabe will man so etwas aber meist gruppiert darstellen, weil das einfach übersichtlicher ist oder aber daraus eine hierarchische Struktur (z. B. XML) erstellen und genau das macht man mit einem Gruppenwechsel.

Die am häufigsten anzutreffende Variante besteht darin, einen Wert zwischenzuspeichern, um ihn dann mit dem nächsten vergleichen zu können. Unterscheiden sich die beiden, wird in der Ausgabe der Gruppenbruch erzeugt und den neue Wert für die nachfolgenden Vergleiche zwischengespeichert:

PHP-Code:
$old null;
foreach (
$rows as $row) {
    if (
$row[$column] != $old) {
        
create_group_break($row[$column]);
        
$old $row[$column];
    }
    
create_row_output($row);

Bis hierher ist das auch noch recht übersichtlich, aber damit ist es dann vorbei, wenn man sowieso mit Arrays arbeiten möchte oder der Gruppenwechsel mehrere Ebenen umfasst.

Dabei ist es gerade in PHP so leicht, wenn man sich die Eigenschaften von Arrays zunutze macht. Bei Wertzuweisungen zu einem Array gibt man ja den Schlüssel an, unter dem der Wert gespeichert werden soll:

PHP-Code:
$array["key"] = $neuerWert
Dabei ist es naheliegenderweise egal, ob unter diesem Schlüssel bereits ein Wert gespeichert war (dann wird er überschrieben) oder ob er neu angelegt wird. Das schöne ist aber, dass dies auch über mehrere Ebenen funktioniert:

PHP-Code:
$array["abc"]["def"][] = "wert 1";
$array["abc"]["ghi"][] = "wert 2";
$array["abc"]["def"][] = "wert 3";
print_r($array); 
ergibt

PHP-Code:
Array
(
    [
abc] => Array
        (
            [
def] => Array
                (
                    [
0] => wert 1
                    
[1] => wert 3
                
)
            [
ghi] => Array
                (
                    [
0] => wert 2
                
)
        )

Vorhandene Schlüssel werden also jeweils weiter benutzt und neue einfach hinzugefügt. Genau das ist schon alles, was man für einen Gruppenwechsel braucht. Wenn man also im Beispiel oben die Datensätze zweistufig gruppieren will – zuerst nach Typ, dann nach Revision – braucht man dafür nicht mehr als das hier:

PHP-Code:
$array = array();
foreach (
$rows as $row) {
    
$array[$row["type"]][$row["rev_id"]][] = $row;

Das gruppierte Ergebnis steht dann in $array. Et voilà.

Digg this Post! Add Post to del.icio.us Bookmark Post in Technorati Furl this Post!
Kategorie: Kategorielos
Hits 5648 Kommentare 10 Stichworte bearbeiten Hinweis auf diesen Blog-Eintrag per E-Mail verschicken
« Zurück     Startseite des Blogs     Nächste »
Kommentare 10

Kommentare

  1. Alter Kommentar
    I recently came across your blog and have been reading along. I thought I would leave my first comment. I did a request on the subject and identified essentially all persons will agree with your online diary Gamerwell - FFXIV Gil - Aion Kinah - Maplestory 2 Mesos | Swtor Credits, Cheap Swtor Credit, Buy Swtor Credits
    permalink
    Veröffentlicht: 24-02-2016 um 07:11 von nikanson nikanson ist offline
  2. Alter Kommentar

    nice

    Wow. cool post. I’d like to write like this too – taking time and real hard work to make a great article… but I put things off too much and never seem to get started. Thanks though. super smash flash 2
    bloons tower defense 5
    permalink
    Veröffentlicht: 24-03-2017 um 03:29 von MarkCPhillips MarkCPhillips ist offline
  3. Alter Kommentar
    Thank you for sharing in this article. I generally want to peruse the quality substance and this thing I found in you post. Hope you keep on sharing a greater amount of your ideas. Thanks a lot for providing this marvelous information which i need so much
    colour switch
    permalink
    Veröffentlicht: 25-07-2017 um 12:57 von keobrad keobrad ist offline
  4. Alter Kommentar
    Used the code on my website at followers and it worked just fine! Thank you, I am your new website follower!
    permalink
    Veröffentlicht: 03-09-2017 um 18:42 von Efugias Efugias ist offline
  5. Alter Kommentar
    play gta games online, So I designed a website which can offer gta money to its users for free directly gta 5 cheats from the GTA database. Visit to grab free gta money.
    permalink
    Veröffentlicht: 09-09-2017 um 08:15 von nishgau nishgau ist offline
  6. Alter Kommentar
    Great post. I found your website perfect for my needs. Very useful info specifically the last part. Thank you for sharing with us, and we sincerely hope you will continue to update or post other articles
    happy wheels
    permalink
    Veröffentlicht: 25-09-2017 um 07:01 von happywheel happywheel ist offline
  7. Alter Kommentar
    Very good, I think I found the knowledge I needed. I will see and refer some information in your post. thank you.
    html color
    permalink
    Veröffentlicht: 26-09-2017 um 04:49 von tommyhulk123 tommyhulk123 ist offline
  8. Alter Kommentar
    Thanks for sharing this valuable information to our vision. You have posted a trust worthy blog keep sharing.
    juegos friv gratis online.
    permalink
    Veröffentlicht: 28-09-2017 um 06:41 von JaneSmith76 JaneSmith76 ist offline
  9. Alter Kommentar
    I have a hobby to read blog post, it will help me to improve my knowledge level, I am a regular visitor of dissertation writing service usa. This is my first visit here and this post is really useful to everyone, especially it will give basic information about PHP language.
    permalink
    Veröffentlicht: 21-10-2017 um 08:11 von irenejacob irenejacob ist offline
  10. Alter Kommentar
    I've read all your information that you shares in your article and I really love it. Thank you for sharing this post. I appreciate it.

    Lily Oliver | madalin stunt cars 2
    permalink
    Veröffentlicht: 28-10-2017 um 11:39 von lilyoliver lilyoliver ist offline
 
Trackbacks 0

Trackbacks


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:42 Uhr.



Search Engine Friendly URLs by vBSEO 3.3.0