2017-10-17 9 views
2

PHPオブジェクトがあり、foreachを使用せずにキーで値を取得しようとしています。PHPオブジェクト配列のキーで値を取得

私がやるなら、私は値を取得することができる午前の下:

$item_data_decode->meta_data[0]->value; 

をしかし項目は、この方法に数えることができないので、異なる順序であってもよいし、しかし、これはない私は、キーを使用する必要があります作品:

$item_data_decode->meta_data['First Name']; 

コード:

$item_data_decode = json_decode($item_values); 
if (!empty($item_data_decode->meta_data)) { 
    $fName = $item_data_decode->meta_data['First Name']->value; 
} 

オブジェクト:

trueを追加
$a = new stdClass(); 
$a->meta_data = array(); 
$a->meta_data[0] = new stdClass(); 
$a->meta_data[0]->id = "2113"; 
$a->meta_data[0]->key = "First Name"; 
$a->meta_data[0]->value = "Recipient First Name"; 
$a->meta_data[1] = new stdClass(); 
$a->meta_data[1]->id = "2114"; 
$a->meta_data[1]->key = "Last Name"; 
$a->meta_data[1]->value = "Recipient Last Name"; 
$a->meta_data[2] = new stdClass(); 
$a->meta_data[2]->id = "2115"; 
$a->meta_data[2]->key = "addressLine 1"; 
$a->meta_data[2]->value = "Recipient Address Line 1"; 
$a->meta_data[3] = new stdClass(); 
$a->meta_data[3]->id = "2116"; 
$a->meta_data[3]->key = "addressLine2"; 
$a->meta_data[3]->value = "Recipient Address Line 2"; 
$a->meta_data[4] = new stdClass(); 
$a->meta_data[4]->id = "2117"; 
$a->meta_data[4]->key = "City"; 
$a->meta_data[4]->value = "Recipient Town/City"; 
$a->meta_data[5] = new stdClass(); 
$a->meta_data[5]->id = "2118"; 
$a->meta_data[5]->key = "Region"; 
$a->meta_data[5]->value = "Recipient Region/County"; 
$a->meta_data[6] = new stdClass(); 
$a->meta_data[6]->id = "2119"; 
$a->meta_data[6]->key = "Country"; 
$a->meta_data[6]->value = "N/A"; 
$a->meta_data[7] = new stdClass(); 
$a->meta_data[7]->id = "2120"; 
$a->meta_data[7]->key = "Postcode"; 
$a->meta_data[7]->value = "Recipient Postcode"; 


// outputs 
[meta_data] => Array ([0] => stdClass Object ([id] => 2113 [key] => First Name [value] => Recipient First Name) [1] => stdClass Object ([id] => 2114 [key] => Last Name [value] => Recipient Last Name) [2] => stdClass Object ([id] => 2115 [key] => addressLine 1 [value] => Recipient Address Line 1) [3] => stdClass Object ([id] => 2116 [key] => addressLine2 [value] => Recipient Address Line 2) [4] => stdClass Object ([id] => 2117 [key] => City [value] => Recipient Town/City) [5] => stdClass Object ([id] => 2118 [key] => Region [value] => Recipient Region/County) [6] => stdClass Object ([id] => 2119 [key] => Country [value] => N/A) [7] => stdClass Object ([id] => 2120 [key] => Postcode [value] => Recipient Postcode)) 

は以下の機能を提供します

Array ([id] => 232 [order_id] => 320 [name] => Tb [product_id] => 50 [variation_id] => 0 [quantity] => 1 [tax_class] => [subtotal] => 50 [subtotal_tax] => 0 [total] => 50 [total_tax] => 0 [taxes] => Array ([total] => Array () [subtotal] => Array ()) [meta_data] => Array ()) Array ([id] => 233 [order_id] => 320 [name] => Turtle Bay Gift Card [product_id] => 50 [variation_id] => 0 [quantity] => 1 [tax_class] => [subtotal] => 30 [subtotal_tax] => 0 [total] => 30 [total_tax] => 0 [taxes] => Array ([total] => Array () [subtotal] => Array ()) [meta_data] => Array ([0] => Array ([id] => 2113 [key] => First Name [value] => Recipient First Name) [1] => Array ([id] => 2114 [key] => Last Name [value] => Recipient Last Name) [2] => Array ([id] => 2115 [key] => addressLine 1 [value] => Recipient Address Line 1) [3] => Array ([id] => 2116 [key] => addressLine2 [value] => Recipient Address Line 2) [4] => Array ([id] => 2117 [key] => City [value] => Recipient Town/City) [5] => Array ([id] => 2118 [key] => Region [value] => Recipient Region/County) [6] => Array ([id] => 2119 [key] => Country [value] => N/A) [7] => Array ([id] => 2120 [key] => Postcode [value] => Recipient Postcode))) 
+0

JSONが間違っています。それを変更すればいいですよ。 – JustCarty

答えて

2

個人的に私はこのようなデータを準備します:

$item_data_decode = json_decode($item_values, true); 
$meta_array = array_combine(array_column($item_data_decode['meta_data'], 'key'), $item_data_decode['meta_data']); 

if (!empty($meta_array['First Name'])) { 
    $fName = $meta_array['First Name']['value']; 
} 

json_decode第二paramは、それが(配列のみを返し確かめますManual.)。このようにしてarray_columnManual)とarray_combineManual)のような配列関数を使用し、必要な構造に非常に近い配列を得ることができます。

Test Caseです。これは、コードを省略するものではありません。

+0

私はOPが 'json_decode()'の第2引数として 'true'を渡さなかったことに全く気づきませんでした。それだけで問題は完全に解決されるはずです。 –

+0

これは私にとってはうまくいかなかった。 '$ meta_array ['First Name']'はtrueを返しません。単に 'true'を追加しても、元のコードでは機能しませんでした。 –

+0

@Ben Damn。私はテストなしで逃げることができると思った。私に数分を与えると私は答えを更新する。 – jh1711

0

あなたはこのようにそれを構造化、その後、アレイ構造を変更することができた場合:

array(
    'First Name'=>array(
     'id'=>2113, 
     'value'=>'Recipient First Name' 
    ), 
    'Last Name'=>array(
     'id'=>2114, 
     'value'=>'Recipient Last Name' 
    ), 
    . . . 
); 

あなたはその後、まだこの配列を使用することができます以前のように必要に応じてforeachループ内で、いくつかの変更があっても、直接必要な値にアクセスできるようになりました。

配列構造を変更できない場合は、不運になります。必要な値を探したい場合は、foreachループが必要です。

アレイに複数回アクセスすることが懸念される場合は、処理する前に配列を上記の構造に変換することを検討してください。

編集

例アレイ変換:

$transformed_array = array(); 
foreach($item_data_decode->meta_data as $data) { 
    $transformed_array[$data['key']] = array(
     'id'=>$data['id'], 
     'value'=>$data['value'] 
    ); 
} 
+0

残念ながら、WooCommerceによって生成された配列構造は変更できません。 唯一の方法は、それぞれの適切なキーに対してforeachを行うことです。 –

+0

修正。しかし、私が言及したように、複数のキーにアクセスする場合は、最初に配列を連想配列に変換する必要があります。これにより 'n(n^2)'アルゴリズムとなる 'n'個の異なるキーに対して潜在的に' n'個の配列アクセスアクションを行い、それを 'n'トランスフォームアクションに移動して' n'配列アクセス'O(n + n)= O(n) 'アルゴリズムのためのアクションは、' n'の因数で時間の複雑さを減らします。また、あなたのコードは多くのクリーナーと維持しやすくなります:) –

+0

@ B.Flemmingありがとうございますこれを行う方法のドキュメンテーションの正しい方向に私を指すことができるですか? –

0

私はすべてを分けておくために、PHPスクリプトにJSONを含めました。

各プロパティへのアクセスは、オブジェクトのプロパティに通常アクセスする方法です。
"First name"には空白があるため、矢印の表記ではアクセスできないため、中括弧で囲む必要があります。スペースを持たないプロパティの場合、中括弧の必要はありません。

コードが失敗したのは、配列に使用されている角かっこ表記を使用してプロパティにアクセスしようとしたためです。

実際の配列出力を編集することはできませんが、JSONを編集することができれば、これで問題は解決します。

$item_data_decode = json_decode('{ 
    "meta_data": { 
     "First name": { 
      "id": 2113, 
      "key": "First name", 
      "value": "Recipient First Name" 
     }, 
     "Last Name": { 
      "id": 2114, 
      "key": "Last Name", 
      "value": "Recipient Last Name" 
     }, 
     "addressLine 1": { 
      "id": 2115, 
      "key": "addressLine 1", 
      "value": "Recipient Address Line 1" 
     }, 
     "addressLine2": { 
      "id": 2116, 
      "key": "addressLine2", 
      "value": "Recipient Address Line 2" 
     }, 
     "City": { 
      "id": 2117, 
      "key": "City", 
      "value": "Recipient Town/City" 
     }, 
     "Region": { 
      "id": 2118, 
      "key": "Region", 
      "value": "Recipient Region/County" 
     }, 
     "Country": { 
      "id": 2119, 
      "key": "Country", 
      "value": "N/A" 
     }, 
     "Postcode": { 
      "id": 2120, 
      "key": "Postcode", 
      "value": "Recipient Postcode" 
     } 
    } 
}'); 

var_dump($item_data_decode->meta_data->{"First name"}->value); // outputs "Recipient First Name" 
関連する問題