mikrocontroller.net

Forum: PC-Programmierung [PHP] JSON daten im JSON Array "umsortieren"


Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein "etwas" merkwürdiges Array:
[{"SEQ":22564,"RNR":321327,"ODATA":"{ \"KW\" : 19, \"stock\" : \"M5\" }"},
{"SEQ":22565,"RNR":321337,"ODATA":"{ \"KW\" : 18, \"stock\" : \"S5\" }"},
{"SEQ":22566,"RNR":321337,"ODATA":"{ \"KW\" : 13, \"stock\" : \"L2\" }"},
{"SEQ":22567,"RNR":321337,"ODATA":"{ \"KW\" : 14, \"stock\" : \"N1\" }"},
{"SEQ":22568,"RNR":321337,"ODATA":"{ \"KW\" : 10, \"stock\" : \"F1\" }"},
{"SEQ":22569,"RNR":321339,"ODATA":"{ \"KW\" : 13, \"stock\" : \"C3\" }"}]

das "JSON" und unter JSON ( ODATA ) wurde etwas eingekürzt (wegen der 
Übersichtlichkeit).

mit json_decode kann ich ja aus dem Array schon ein brauchbares 
PHP-Array machen... allerdings möchte ich z.B. nach KW (aus ODATA) 
Sortieren.
Array
(
    [0] => Array
        (
            [SEQ] => 22564
            [RNR] => 321327
            [ODATA] => { "KW" : 19, "stock" : "M5" }
        )

    [1] => Array
        (
            [SEQ] => 22565
            [RNR] => 321337
            [ODATA] => { "KW" : 18, "stock" : "S5" }
        )

    [2] => Array
        (
            [SEQ] => 22566
            [RNR] => 321337
            [ODATA] => { "KW" : 13, "stock" : "L2" }
        )
...

> Leider kann ich am "Array" nichts machen... das ist ein DB-Export.

grüßle :)

Autor: Abradolf Lincler (Firma: Ricksy Business) (abradolf_lincler) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sortieren mithilfe einer customisierten Compare-Funktion welche als 
Input zwei Arrayeinträge erhält und anhand des eingebetteten KW Werts 
den entsprechenden Compareoutput liefert.

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, das habe ich mal gehört...

ein 2. Array zu erzeugen, welches die kw-werte in der Reihenfolge vom 1. 
array hat, wäre ja kein Problem.

Aber wie genau mach ich dann die Umsortierung? Würde mich über einen 
Link oder ein kleines Beispiel freuen...

Autor: TestX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf php.net nach usort suchen...

Autor: H. E. (hobby_elektroniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder "manuell" Iterieren und die KW als Index benutzen und die 
Einträge als Mehrdimensionales Array umformen. Ist aber etwas 
aufwändiger setzt Erfahrung voraus.

Wäre schön, wenn du auch zeigen würdest, was deine bisherigen Versuche 
waren im Form von Code.

Die sauberste Methode wäre die von Abradolf Lincler.
Siehe dazu http://php.net/manual/de/function.usort.php

baer schrieb:
>> Leider kann ich am "Array" nichts machen... das ist ein DB-Export.
Inwiefern DB-Export? Weil der Json-String aus einem Datenbankfeld kommt?

Probiere es aus, zeig uns deinen Versuch. Auf deinen Versuch kann man 
dann direkt Bezug nehmen und dir so am besten helfen. Alles andere ist 
zu hypothetisch oder viel helfend wie ein Blick in die Doku zu usort.

Autor: Abradolf Lincler (Firma: Ricksy Business) (abradolf_lincler) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
H. E. schrieb:
> Die sauberste Methode wäre die von Abradolf Lincler.
> Siehe dazu http://php.net/manual/de/function.usort.php

Genau, usort hieß das Ding, ich hatte nur das qsort von C im Kopf. Schon 
ewig kein PHP mehr gemacht, wusste nur, dass es das dort auch noch gibt.

Autor: H. E. (hobby_elektroniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So könnte es klappen. ;)
<?php

$strJson = '[{"SEQ":22564,"RNR":321327,"ODATA":"{ \"KW\" : 19, \"stock\" : \"M5\" }"},
{"SEQ":22565,"RNR":321337,"ODATA":"{ \"KW\" : 18, \"stock\" : \"S5\" }"},
{"SEQ":22566,"RNR":321337,"ODATA":"{ \"KW\" : 13, \"stock\" : \"L2\" }"},
{"SEQ":22567,"RNR":321337,"ODATA":"{ \"KW\" : 14, \"stock\" : \"N1\" }"},
{"SEQ":22568,"RNR":321337,"ODATA":"{ \"KW\" : 10, \"stock\" : \"F1\" }"},
{"SEQ":22569,"RNR":321339,"ODATA":"{ \"KW\" : 13, \"stock\" : \"C3\" }"}]';

$array = json_decode( $strJson, true );
jsonDecode( $array );
usort( $array, 'sortByKw' );

function jsonDecode( &$data ) {

  foreach( $data as $key => &$value ) {
    if( is_array( $value ) ) {
      jsonDecode( $value );
    }
    elseif( is_string( $value ) && !is_numeric( $value ) ) {
      $tmp = json_decode( $value, true );
      if( !empty( $tmp ) && is_array( $tmp ) ) {
        $value = $tmp;
      }
    }
  }
}

function sortByKw( $a, $b ) {

  if( isset( $a['ODATA']['KW'] ) && isset( $b['ODATA']['KW'] )) {
    return ($a['ODATA']['KW'] > $b['ODATA']['KW'] ? -1 : 1);
  }
}

1. Es liest rekursiv Json-Strings aus
2. Berücksichtigt "stock" in der Sortierung nicht
3. Sortiert absteigend
4. Ist nicht OOP sondern nur daher geschludert und würde bei uns so nie 
durch die QA gehen. Aber die Verwendung sollte klar geworden sein.

2. darfst du selbst tun und 3. auch, falls aufsteigend erwünscht ist. 
Tipp: -1 : 1

: Bearbeitet durch User
Autor: H. E. (hobby_elektroniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
baer schrieb:
> Hallo,
>
> ich habe ein "etwas" merkwürdiges Array:
>

Warum merkwürdig? Weil ein Json-String in einem Json-String enthalten 
ist?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.