[PHP] JSON daten im JSON Array "umsortieren"

Gast #4949654
Lesenswert?
• ▲
▼
Hallo,

ich habe ein "etwas" merkwürdiges Array:
1
[{"SEQ":22564,"RNR":321327,"ODATA":"{ \"KW\" : 19, \"stock\" : \"M5\" }"},
2
{"SEQ":22565,"RNR":321337,"ODATA":"{ \"KW\" : 18, \"stock\" : \"S5\" }"},
3
{"SEQ":22566,"RNR":321337,"ODATA":"{ \"KW\" : 13, \"stock\" : \"L2\" }"},
4
{"SEQ":22567,"RNR":321337,"ODATA":"{ \"KW\" : 14, \"stock\" : \"N1\" }"},
5
{"SEQ":22568,"RNR":321337,"ODATA":"{ \"KW\" : 10, \"stock\" : \"F1\" }"},
6
{"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.
1
Array
2
(
3
    [0] => Array
4
        (
5
            [SEQ] => 22564
6
            [RNR] => 321327
7
            [ODATA] => { "KW" : 19, "stock" : "M5" }
8
        )
9

10
    [1] => Array
11
        (
12
            [SEQ] => 22565
13
            [RNR] => 321337
14
            [ODATA] => { "KW" : 18, "stock" : "S5" }
15
        )
16

17
    [2] => Array
18
        (
19
            [SEQ] => 22566
20
            [RNR] => 321337
21
            [ODATA] => { "KW" : 13, "stock" : "L2" }
22
        )
23
...

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

grüßle :)
Gast #4949673
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...
#4949697
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.
#4949746
Lesenswert?
• ▲
▼
So könnte es klappen. ;)
1
<?php
2

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

10
$array = json_decode( $strJson, true );
11
jsonDecode( $array );
12
usort( $array, 'sortByKw' );
13

14
function jsonDecode( &$data ) {
15

16
  foreach( $data as $key => &$value ) {
17
    if( is_array( $value ) ) {
18
      jsonDecode( $value );
19
    }
20
    elseif( is_string( $value ) && !is_numeric( $value ) ) {
21
      $tmp = json_decode( $value, true );
22
      if( !empty( $tmp ) && is_array( $tmp ) ) {
23
        $value = $tmp;
24
      }
25
    }
26
  }
27
}
28

29
function sortByKw( $a, $b ) {
30

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

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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.