【问题标题】:Complete arrays with different keys具有不同键的完整数组
【发布时间】:2016-06-01 19:20:44
【问题描述】:

我从一些网站收到不同的 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"];

我只想在每个数组上都有相同的键

我尝试的是遍历所有对象并将所有现有键保存在$arraykeys 上。然后再次foreach所有对象检查当前是否 密钥在创建的$arraykeys 内,但是对于大型 json 对象来说这真的很慢。

到目前为止,我为获得所有密钥所做的尝试:

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

但不知道如何完成具有所有键的数组。我该如何解决这个问题?

注意:对象可能有n 位置和更多键。这只是一个例子。理想情况下,每个数组上的键顺序相同。

【问题讨论】:

  • “arraykeys”是否被称为预定义列表?
  • 不,这只是一个例子,但还有更多的键,如电子邮件、地址等。将来可能还会更多。这就是为什么我需要得到所有的钥匙......
  • @KrBm eval.in/581163 您可以使用您的解决方案来构建密钥数组。它有效
  • @KrBm 或者如果您使用 'unknown` 初始化数组键,则稍微简化第二个循环 - eval.in/581178

标签: php arrays


【解决方案1】:

使用call_user_func_array、array_replace_recursive、array_keys、array_fill_keys和array_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"=>"myemail@gmail.com", "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] => myemail@gmail.com
            [address] => Jack London st. 102
        )

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

【讨论】:

  • 看起来 phone 只是在第一个数组上,我该如何解决这个问题?
  • @KrBm 抱歉,请稍等。会有更新
【解决方案2】:

如果您想对多个字段执行此操作,可以执行以下操作:

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

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

它将用数组中存在的值替换未知值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2017-07-07
    • 2021-05-31
    • 2012-04-17
    相关资源
    最近更新 更多