2017-05-02 3 views
0

Das hat für ein paar Tage mein Gehirn zerreißt. Ich dachte, ich hätte eine Lösung, aber es fällt mir schwer, ein immer funktionierendes, kugelsicheres Stück Code zu entwickeln. Ich durchquere ein mehrdimensionales Array. Ich habe zwei Funktionen, eine, die eine einzelne Zeile betrachtet und eine, die ein Array betrachtet. Ich habe zwei poetentielle Konfigurationen für ein Array.Mehrdimensionales Array kann ein einzelnes Element oder ein anderes Array enthalten. Wie durchqueren?

Erstes Beispiel

[ 
    'Person' => [ 
     'Name' => 'John Smith' 
    ] 
] 

(Ein einzelnes Ergebnis für Person, mit nur einem Namen für diese Person.)

Zweites Beispiel

[ 
    'Person' => [ 
     'Name' => [ 
      0 => 'John Smith', 
      1 => 'John Denver' 
     ] 
    ] 
] 

(Eine einzelne Person , mit mehreren Namen für diese Person.)

Drittes Beispiel

[ 
    'Person' => [ 
     0 => [ 
      'Name' => 'John Smith' 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
] 

(zwei Personen, die jeweils mit einem Namen nur.)

Viertes Beispiel

[ 
    'Person' => [ 
     0 => [ 
      'Name' => [ 
       0 => 'John Smith', 
       1 => 'John Denver' 
      ] 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
] 

(Zwei Menschen, die erste hat zwei Namen , der zweite hat nur einen.)

Hoffentlich versteht man das, was ich sage. Wenn nur ein Datensatz für etwas vorhanden ist, wird der einzelne Datensatz zurückgegeben. Wenn es mehr als einen Datensatz gibt, wird ein Array mit jedem dieser Datensätze vorhanden sein.

Ich muss durch das multidimensionale Array von Anfang bis Ende durchqueren. Ich versuche herauszufinden, genau zu prüfen, ob es eine einzige Antwort oder mehrere gibt.

Ich habe versucht, nach Array-Schlüsselnamen zu überprüfen und zu prüfen, ob Schlüssel ganze Zahlen gegen Zeichenfolgen sind und ob etwas ein Array ist oder nicht.

Nichts funktioniert so wie ich es erwarte. Kann jemand helfen, eine Möglichkeit zu bieten, zu transversieren und zu überprüfen, zum Beispiel eine foreach Schleife oder eine Funktion?

Wenn es hilft, habe ich ein anderes Array, das die Namen der Schlüsselfelder enthält, nach denen es sucht. Dieses Array würde ein ähnliches Layout wie folgt haben:

Jede Hilfe würde sehr geschätzt werden.

bearbeiten

Da dies war nicht klar. Ich bin auf der Suche nach, wie der Elternschlüssel auf den Kindwert angewendet werden kann, unabhängig davon, ob der Wert ein einzelner Wert ist oder ob es ein Array mit mehreren Werten ist. Das Schlüsselelternteil muss auf alle untergeordneten Elemente angewendet werden, sofern nicht ein anderer übergeordneter Schlüssel vorhanden ist (theoretisch könnte eine unbegrenzte Anzahl von untergeordneten Schlüsseln/übergeordneten Schlüsseln unterhalb eines übergeordneten Schlüssels vorhanden sein).

Finale

ich es geschafft, dies herauszufinden. Danke an alle für Ihre Hilfe.

+0

Ich habe Ihre Frage nicht bekommen, ich habe alle vier Arrays, die Sie an der Spitze gebucht haben, was ist dann Ihr jetzt erwartete Ausgabe? –

+0

Nicht sicher, ob Sie die Möglichkeit haben, dies zu tun, aber es wird für Sie und jeden in Zukunft viel einfacher sein, wenn die Ergebnisse standardisiert sind. Was ich meine ist, das vierte Beispiel wird immer verwendet, egal wie viele Personen oder Namen es gibt. –

+0

Leider kann ich das nicht tun. Ich versuche, es so robust wie möglich zu machen und viele verschiedene Möglichkeiten zuzulassen. Dieser Code wird zum Entschlüsseln von HTML/XML-Tags dienen, die in Arrays eingefügt werden, und ich will in der Lage sein, mit allem umzugehen, was auf ihn geworfen wird. –

Antwort

0

Wenn Sie nur versuchen, eine Liste von Personen zu erhalten, können Sie Ihre Daten mit array_walk_recursive normalisieren, um dies als eine Liste von Namen aus beiden Formaten zu sehen.

function normaliseData($peopleData) { 
    $people = []; 
    array_walk_recursive($peopleData, function($item, $key) use(&$people) {  
     $people[] = $item;   
    }); 
    return $people; 
} 
print_r(normaliseData($first)); // Array ([0] => John Smith) 
print_r(normaliseData($second)); // Array ([0] => John Smith [1] => John Denver) 
print_r(normaliseData($third)); // Array ([0] => John Smith [1] => Jane Doe) 
print_r(normaliseData($fourth)); // Array ([0] => John Smith [1] => John Denver [2] => Jane Doe) 
+0

Das Problem mit dem Array_walk_recursive ist, dass wir viele sehr unterschiedliche Arrays darin werfen werden, sie werden niemals so grundlegend sein und in einigen Fällen werden Schlüsselnamen auf verschiedenen Ebenen des Multi-Multi-Multi-Dimensional wiederverwendet Array. –

+0

Dies wird die vier aufgeführten Testfälle behandeln. Wenn wir die Formate, in denen die Daten empfangen werden, nicht voraussehen können, sehe ich nicht, wie es möglich ist, eine Lösung zu schreiben. Es löst das Problem vom falschen Ende. Die Daten sollten idealerweise durch einen Mechanismus in ein erwartetes Format normalisiert werden. – JasonBoss

+0

Ich glaube, Sie hatten den Eindruck, dass das Array immer gleich sein würde. Was ich letztendlich suche, ist eine Möglichkeit, jeden einzelnen Wert zu treffen und zu wissen, wann ein Schlüssel mehr als einen Wert hat. Im Fall von Beispiel 4 würde es also wissen, dass es zwei Namen für diese eine Person gibt. Wir müssen den Schlüssel "Name" entweder mit einem einzelnen Nicht-Array-Wert verknüpfen oder den Namenschlüssel auf jeden Unterwert dieses mehrdimensionalen Arrays anwenden. –

0

Für diese array_walk_recursive ist die beste Option, da das Amt des @JasonBoss funktioniert, aber wenn es aus einer Funktion manuell tun möchten, können Sie es wie dies tun können.

Try this code snippet here

<?php 
ini_set('display_errors', 1); 

$array1=[ 
    'Person' => [ 
     'Name' => 'John Smith' 
    ] 
]; 
$array2=[ 
    'Person' => [ 
     'Name' => [ 
      0 => 'John Smith', 
      1 => 'John Denver' 
     ] 
    ] 
]; 
$array3=[ 
    'Person' => [ 
     0 => [ 
      'Name' => 'John Smith' 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
]; 
$array4=[ 
    'Person' => [ 
     0 => [ 
      'Name' => [ 
       0 => 'John Smith', 
       1 => 'John Denver' 
      ] 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
]; 

$result=array(); 
getRecords($array1); 
print_r($result); 

$result=array(); 
getRecords($array2); 
print_r($result); 

$result=array(); 
getRecords($array3); 
print_r($result); 

$result=array(); 
getRecords($array4); 
print_r($result); 


function getRecords($array) 
{ 
    global $result; 
    foreach($array as $key => $value) 
    { 
     if(is_string($value)) 
     { 
      $result["names"][]=$value; 
     } 
     elseif(is_array($array[$key]) && count($array[$key])) 
     { 
      getRecords($value); 
     } 
    } 
} 
+0

Leider kann es in diesem Fall andere Fälle nicht behandeln, wenn etwas nicht eine Zeichenfolge ist. Könnte die is_string-Funktion durch eine! Is_array-Funktion ersetzt werden und funktioniert sie ähnlich? –

+0

Ich ging zurück und sah es an, und leider funktioniert der Code nicht wie erwartet. Unser Ziel ist es nicht, die Namen der Personen zu sammeln, sondern nur das Array durch alle Werte zu durchlaufen und das gleiche Array wie das, was präsentiert wurde, zurückzugeben. Hier ist eine Änderung, die ich gemacht habe, dass ich dachte, würde funktionieren, aber wie Sie sehen können, gibt es ein seltsames Verhalten auf Array # 4 zum Beispiel. https://eval.in/785854 –

Verwandte Themen