2016-05-12 9 views
1

Ich habe Daten im JSON-Format (Prestashop) gespeichert - ich muss zu, dass Daten - die tief in Arrays verschachtelt ist. HierIterate durch tief verschachtelte Array in PHP

ist die Funktion:

public static function getAllCustomizedDatas($id_cart, $id_lang = null, $only_in_cart = true, $id_shop = null) 
{ 
    $datas = parent::getAllCustomizedDatas($id_cart, $id_lang, $only_in_cart, $id_shop); 
    var_dump($datas); 
    /* 
    * Iterate over $datas, you're looking for 
    * [id_product][id_product_attribute][id_address_delivery][id_customization][datas] 
    * Datas will contain an array of fields broken by their type. You can then decode 
    * the ones that need to be decoded and return the result: 
    */ 


    return $datas; 
} 

wenn ich $ Daten var_dump Das sehe ich (ich formatiert diese, um es ein wenig einfacher für mich zu lesen):

array(1) { 
    [8]=> array(1) { 
     [0]=> array(1) { 
      [0]=> array(2) { 
       [22]=> array(4) { 
        ["datas"]=> array(1) { 
         [1]=> array(1) { 
          [0]=> array(9) { 
           ["id_customization"]=> string(2) "22" 
           ["id_address_delivery"]=> string(1) "0" 
           ["id_product"]=> string(1) "8" 
           ["id_customization_field"]=> string(1) "2" 
           ["id_product_attribute"]=> string(1) "0" 
           ["type"]=> string(1) "1" 
           ["index"]=> string(1) "2" 
           ["value"]=> string(615) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]" 
           ["name"]=> string(20) "Client Customization" 
          } 
         } 
        } 
        ["quantity"]=> int(2) 
        ["quantity_refunded"]=> int(0) 
        ["quantity_returned"]=> int(0) 
       } 
       [23]=> array(4) { 
        ["datas"]=> array(1) { 
         [1]=> array(1) { 
          [0]=> array(9) { 
           ["id_customization"]=> string(2) "23" 
           ["id_address_delivery"]=> string(1) "0" 
           ["id_product"]=> string(1) "8" 
           ["id_customization_field"]=> string(1) "2" 
           ["id_product_attribute"]=> string(1) "0" 
           ["type"]=> string(1) "1" 
           ["index"]=> string(1) "2" 
           ["value"]=> string(615) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]" 
           ["name"]=> string(20) "Client Customization" 
          } 
         } 
        } 
        ["quantity"]=> int(2) 
        ["quantity_refunded"]=> int(0) 
        ["quantity_returned"]=> int(0) 
       } 
      } 
     } 
    } 
} 

Was wird der einfachste Weg zum [Wert] Teil des tief geschachtelten Arrays?

Dies muss relativ dynamisch sein, da abhängig von der Anzahl der Elemente, die dieser Benutzer hat - die Anzahl der Arrays wird sich ändern. In diesem Beispiel gibt es 2 (jeweils mit 2 Elementen in "Wert"). Ein Benutzer könnte 3 oder 4 oder 10 Elemente hinzufügen, wenn sie es wollten. Aber ich versuche nur, zu ['value'] zu kommen und das JSON in HTML für die Ansicht zu konvertieren, an die es übergeben wird.

Bonus: Können Sie die JSON-Daten einfach durchlaufen?

Die JSON-Daten sieht wie folgt aus:

[ 
    [{ 
     "name": "item[1][line1]", 
     "customization": "asdf" 
    }, { 
     "name": "item[1][line2]", 
     "customization": "" 
    }, { 
     "name": "item[1][line3]", 
     "customization": "" 
    }, { 
     "name": "item[1][line4]", 
     "customization": "" 
    }, { 
     "name": "item[1][line5]", 
     "customization": "" 
    }, { 
     "name": "item[1][line6]", 
     "customization": "" 
    }, { 
     "name": "item[1][line7]", 
     "customization": "" 
    }], 
    [{ 
     "name": "item[2][line1]", 
     "customization": "asdf" 
    }, { 
     "name": "item[2][line2]", 
     "customization": "" 
    }, { 
     "name": "item[2][line3]", 
     "customization": "" 
    }, { 
     "name": "item[2][line4]", 
     "customization": "" 
    }, { 
     "name": "item[2][line5]", 
     "customization": "" 
    }, { 
     "name": "item[2][line6]", 
     "customization": "" 
    }, { 
     "name": "item[2][line7]", 
     "customization": "" 
    }] 
] 
+0

Was kehrt diese Linie? '$ datas = json_decode ($ datas [data]);' Ich könnte einen var_dump direkt danach zum Debuggen verwenden. – JakeParis

+0

Ich habe dort einen var_dump gesetzt, sehe aber nichts. Dies ist (glaube ich), weil dies nur an die Ansicht übergeben wird (eine Vorlagendatei). Wenn also in der .tpl nichts angezeigt wird, wird var_dump nicht angezeigt. – Hanny

+0

Ich kann nicht mit Ihrer genauen Architektur sprechen, aber in solchen Fällen bringt mir ein var_dump mit 'die' oft, was ich brauche. Alternativ können Sie 'error_log' verwenden – JakeParis

Antwort

0

ich nur am Ende eine Reihe von foreach-Anweisungen verschachteln, bis ich an der Reihe angekommen war ich wollte. Es war hässlich, aber funktional.

Dann habe ich json_decode über den JSON und iterated über es.

0

https://packagist.org/packages/ishworkh/multi-level-array-iterator

Dies könnte in Iterieren durch tiefe verschachtelte Array hilfreich sein. Verwenden Sie dann Schlüssel- oder Hierarchieinformationen, um den für Sie benötigten Wert herauszufiltern.

Lets sagen, dass dies Ihr Array ist

$array = [ 
    [ 
     [ 
      [ 
       [ 
        "datas"    => [ 
         [ 
          [ 
           "id_customization"  => "22", 
           "id_address_delivery" => "0", 
           "id_product"    => "8", 
           "id_customization_field" => "2", 
           "id_product_attribute" => "0", 
           "type"     => "1", 
           "index"     => "2", 
           "value"     => '[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]', 
           "name"     => "Client Customization", 
          ], 
         ], 
        ], 
        "quantity"   => 2, 
        "quantity_refunded" => 0, 
        "quantity_returned" => 0, 
       ], 
       [ 
        [ 
         [ 
          [ 
           "id_customization"  => "23", 
           "id_address_delivery" => "0", 
           "id_product"    => "8", 
           "id_customization_field" => "2", 
           "id_product_attribute" => "0", 
           "type"     => "1", 
           "index"     => "2", 
           "value"     => '[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]', 
           "name"     => "Client Customization", 
          ], 
         ], 
        ], 
        "quantity"   => 2, 
        "quantity_refunded" => 0, 
        "quantity_returned" => 0, 
       ], 
      ], 
     ], 
    ], 
]; 

Sie könnten eine Funktion wie diese erstellen, die Multi-Level-Array-Iterators Iterierte Methode verwendet gehen über die ganze verschachtelte Array und Ausbeute aus Werten gefunden.

/** 
* @param array $nestedArray 
* 
* @return Generator 
*/ 
function extractValuesFromArray(array $nestedArray):Generator 
{ 
    // $key is the local index key, which in this case should be 'value' we are looking to filter for 
    foreach(\ArrayIterator\ArrayIteratorFacade::iterate($nestedArray) as $key => $ArrayElement) 
    { 
     if ('value' === $key) 
     { 
      yield $ArrayElement->getValue(); 
     } 
    } 
} 

var_dump(iterator_to_array(extractValuesFromArray($array))); 

geben sollte

array(2) { 
    [0]=> 
    string(643) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]" 
    [1]=> 
    string(643) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]" 
}  
+0

Willkommen bei SO. Bitte geben Sie keine Link-Only-Antworten an: Links können kaputt gehen und die Antwort wird irrelevant. Platziere stattdessen die wichtigsten Bits direkt in deinem Beitrag. – YakovL

+0

Vielen Dank und ich schätze Ihren Vorschlag @YakovL –