2016-06-01 10 views
1

Ich erhalte verschiedene JSON-Objekte von einigen Websites. Diese Objekte sehen normalerweise nicht gleich aus.Komplette Arrays mit verschiedenen Schlüsseln

Wie kann ich die fehlenden Schlüssel an jeder Position des JSON-Objekts hinzufügen?

Hier haben Sie ein Beispiel das Objekt darzustellen gegeben

$data = new stdClass(); 
$data->a1 = ["name"=>"John","age"=>"27","phone"=>"5566634"]; 
$data->a2 = ["name"=>"Mark","age"=>"38","gender"=>"Male"]; 

Und das ist die gewünschte Ausgabe:

$data->a1 = ["name"=>"John","age"=>"27","phone"=>"5566634", "gender"=>"unknown"]; 
$data->a2 = ["name"=>"Mark","age"=>"38","phone"=>"unknown", "gender"=>"Male"]; 

Ich möchte nur auf jedem Array die gleichen Schlüssel haben

Was Ich habe versucht, das Objekt zu foreach und alle vorhandenen Schlüssel auf $arraykeys zu speichern. Dann foreach wieder alle Objekt überprüfen, ob der aktuelle Schlüssel ist innerhalb der $arraykeys erstellt, aber das ist wirklich langsam mit großen JSON-Objekte.

Was ich bisher versucht haben, alle Schlüssel zu erhalten:

$arraykeys = []; 
foreach ($data as $item) { 
    foreach ($item as $key => $value) { 
     if (! array_key_exists($key, $arraykeys)){ 
      $arraykeys[$key] = null; 
     } 
    } 
} 

aber nicht wissen, wie die Arrays abzuschließen alle Schlüssel mit. Wie kann ich dieses Problem lösen?

Hinweis: Das Objekt kann n Positionen und mehr Schlüssel haben. Dies ist nur ein Beispiel. Idealerweise befinden sich die Schlüssel in jeder Anordnung in der gleichen Reihenfolge.

+0

Ist "arraykeys" als vordefinierte Liste bekannt? – RomanPerekhrest

+0

Nein, das ist nur ein Beispiel, aber es gibt mehr Schlüssel, wie E-Mail, Adresse usw. Auch könnte in Zukunft mehr sein. Deshalb muss ich alle Schlüssel bekommen ... – David

+0

@KrBm https://eval.in/581163 Sie können Ihre Lösung verwenden, um Schlüssel-Array zu erstellen. Es funktioniert – splash58

Antwort

2

Die erweiterte Lösung mit call_user_func_array, array_replace_recursive, array_keys, array_fill_keys und array_merge Funktionen:

$data = new stdClass(); 
$data->a1 = ["name"=>"John","age"=>"27","phone"=>"5566634"]; 
$data->a2 = ["name"=>"Mark","age"=>"38","gender"=>"Male"]; 
$data->a3 = ["name"=>"Mark","age"=>"38","gender"=>"Male", "email"=>"[email protected]", "address"=>"Jack London st. 102"]; 
$data->a4 = ["name"=>"John","age"=>"30","gender"=>"Male"]; 

// getting the array containing all possible keys 
$keys = call_user_func_array('array_replace_recursive', (array) $data); 

// filling predefined list of keys with "unknown" value 
$keys = array_fill_keys(array_keys($keys), "unknown"); 

foreach ($data as &$prop) { 
    $prop = array_merge($keys, $prop); 
} 

print_r($data); 

Der Ausgang:

stdClass Object 
(
    [a1] => Array 
     (
      [name] => John 
      [age] => 27 
      [phone] => 5566634 
      [gender] => unknown 
      [email] => unknown 
      [address] => unknown 
     ) 

    [a2] => Array 
     (
      [name] => Mark 
      [age] => 38 
      [phone] => unknown 
      [gender] => Male 
      [email] => unknown 
      [address] => unknown 
     ) 

    [a3] => Array 
     (
      [name] => Mark 
      [age] => 38 
      [phone] => unknown 
      [gender] => Male 
      [email] => [email protected] 
      [address] => Jack London st. 102 
     ) 

    [a4] => Array 
     (
      [name] => John 
      [age] => 30 
      [phone] => unknown 
      [gender] => Male 
      [email] => unknown 
      [address] => unknown 
     ) 
) 
+0

sieht aus wie das 'Telefon' ist nur auf dem ersten Array, wie kann ich das beheben? – David

+0

@KrBm Entschuldigung, nur einen Moment. Es wird ein Update geben – RomanPerekhrest

+0

überprüfen Sie mein Update. Jetzt ist es in Ordnung – RomanPerekhrest

2

Wenn Sie dies mit vielen Feldern durchführen möchten, können Sie folgendes tun:

<?php 
$defaultArray = [ 
    'name' => 'unknown', 
    'age' => 'unknown', 
    'gender' => 'unknown', 
    'phone' => 'unknown', 
]; 

foreach ($data as $item) { 
    $item = array_merge($defaultArray, $item); 
} 

Es wird die unbekannten Werte durch die Werte ersetzen, die im Array vorhanden sind.

Verwandte Themen