Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用不同的键完成数组_Php_Arrays - Fatal编程技术网

Php 使用不同的键完成数组

Php 使用不同的键完成数组,php,arrays,Php,Arrays,我从一些网站收到不同的json对象。 这些对象通常看起来不一样 如何在json对象的每个位置添加缺少的键 这里有一个示例来表示给定的对象 $data = new stdClass(); $data->a1 = ["name"=>"John","age"=>"27","phone"=>"5566634"]; $data->a2 = ["name"=>"Mark","age"=>"38","gender"=>"Male"]; 这就是期望的输出: $d

我从一些网站收到不同的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
上的所有现有键。然后再次foreach所有对象,检查当前 键位于创建的
$arraykeys
中,但对于大型json对象来说,这非常缓慢

到目前为止,我一直试图得到所有的钥匙:

$arraykeys = [];
foreach ( $data as $item ) {
    foreach ( $item as $key => $value ) {
        if (! array_key_exists($key, $arraykeys)){
            $arraykeys[$key] = null;
        }
    }
}
但不知道如何完成拥有所有密钥的数组。我怎样才能解决这个问题


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

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

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

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

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

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

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

使用
调用用户函数数组
数组替换递归
数组键
数组填充键
数组合并
函数的扩展解决方案:

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

使用
调用用户函数数组
数组替换递归
数组键
数组填充键
数组合并
功能的扩展解决方案:

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

“arraykeys”是一个预定义的列表吗?不,这只是一个示例,但还有更多的键,如电子邮件、地址等。将来可能还会更多。这就是为什么我需要获取所有密钥…@KrBm您可以使用您的解决方案来构建密钥阵列。信息技术works@KrBm或者,如果您使用“未知”初始化arraykeys,则可以稍微简化第二个循环——“arraykeys”是否被称为预定义列表?不,这只是一个示例,但还有更多的键,如电子邮件、地址等。将来可能还会更多。这就是为什么我需要获取所有密钥…@KrBm您可以使用您的解决方案来构建密钥阵列。信息技术works@KrBm或者,如果使用“未知”初始化arraykeys,则稍微简化第二个循环-看起来
手机
就在第一个数组上,我如何修复此问题?@KrBm抱歉,请稍候。将会有一个更新,例如
手机
就在第一个阵列上,我如何修复它?@KrBm抱歉,请稍等。将会有一个更新