通过php对象数组的键获取值

时间:2017-10-17 21:32:48

标签: php arrays

我有一个PHP对象,我试图通过密钥获取值而不使用foreach。

如果我执行以下操作,我可以获得值:

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

对象:

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

true添加到json_decode可提供以下信息:

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

3 个答案:

答案 0 :(得分: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中的第二个参数确保它只返回数组(Manual.)。这样您就可以使用array_columnManual)和array_combineManual)之类的数组函数,并获得一个非常接近您想要的结构的数组。

Test Case,因为没有代码可以缩短它。

答案 1 :(得分: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']
    );
}

答案 2 :(得分:0)

我已将JSON包含在PHP脚本中,以便将所有内容分开。

访问每个属性是您通常访问对象属性的方式 请注意,由于"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"