2016-06-01 6 views
1

いくつかのウェブサイトから異なるjsonオブジェクトを受け取っています。 このオブジェクトは通常、同じに見えません。異なるキーで配列を完成

jsonオブジェクトのすべての位置に欠けているキーを追加するにはどうすればよいですか?ここで

あなたは

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

指定されたオブジェクトを表現する例があり、それは、所望の出力です:私はちょうどすべてのアレイ上に同じキーを持つようにしたい

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

何私はしようとしたすべてのオブジェクトをforeachし、すべての既存のキーを$arraykeysに保存することです。現在の キーが$arraykeysの内部にある場合はオブジェクトチェックを再度行いますが、これは大きなjsonオブジェクトでは非常に遅いです。私はすべてのキーを取得するために、これまで試したどのような

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

が、すべてのキーを持つ配列を完成する方法がわかりません。どうすればこの問題を解決できますか?

注:オブジェクトには、n個の位置以上のキーがある場合があります。これは単なる例です。理想的には、キーはすべての配列で同じ順序になります。あなたは多くの分野でこれを実行したい場合は、次の操作を行うことができます

+0

が事前に定義されたリストとして知られる "arraykeys" となっていますか? – RomanPerekhrest

+0

いいえ、これは単なる例ですが、電子メール、アドレスなど、より多くのキーがあります。だから私はすべてのキーを取得する必要があります... – David

+0

@KrBm https://eval.in/581163あなたのソリューションを使用してキー配列を構築することができます。それは – splash58

答えて

2

call_user_func_arrayarray_replace_recursivearray_keysarray_fill_keysarray_merge機能を使用して、拡張ソリューション:

$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); 

出力:

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

'phone'のように見えますが、どうすればいいですか? – David

+0

@KrBm申し訳ありませんが、ほんの一瞬です。アップデート – RomanPerekhrest

+0

が更新されます。今それはいいです – RomanPerekhrest

2

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

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

それはあなたの配列に存在している値で、未知の値を置き換えます。

関連する問題