PHP - 确保数组包含特定键

时间:2018-05-05 16:25:55

标签: php arrays

我有一个像这样的PHP数组..

Array
(
    [04] => 1
    [09] => 1
    [10] => 1
    [01] => 1
)

我想确保它中有1-10键,如果它们不存在,那么我希望它们的值为0,所以我的最终数组看起来像这样......

Array
(
    [01] => 1
    [02] => 0
    [03] => 0
    [04] => 1
    [05] => 0
    [06] => 0
    [07] => 0
    [08] => 0
    [09] => 1
    [10] => 1
)

我这样做..

if (!array_key_exists("01",$myarray)) {
     $myarray['01'] = 0;
}

if (!array_key_exists("02",$myarray)) {
     $myarray['02'] = 0;
}

if (!array_key_exists("02",$myarray)) {
     $myarray['02'] = 0;
}

if (!array_key_exists("03",$myarray)) {
     $myarray['03'] = 0;
}

依此类推,直到10岁,然后我按照正确的顺序进行ksort

ksort($myarray)

这有效,但我知道这很笨重,可能效率不高。

有人能指出我更好的解决方案吗?

6 个答案:

答案 0 :(得分:3)

只需使用像这样的for循环

    For($i = 1;$i<=10;$i++){

        $index = (string)sprintf("%02d",$i);

        if (!array_key_exists($index,$myarray)) {
            $myarray[$index] = 0;
        }

    }

我希望它有所帮助。

答案 1 :(得分:2)

您可以使用简单的for循环:

$myarray = array(
    1 => 1, 
    2 => 1,
    3 => 1);

for ($i = 1; $i < 11; $i++) {
    if (!isset($myarray[$i]))
        $myarray[$i] = 0;
}

print_r($myarray);

/* Output : 

Array ( [1] => 1 [2] => 1 [3] => 1 [4] => 0 
[5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 )

*/

答案 2 :(得分:1)

您可以构建一个空白数组(使用array_fill()),然后使用array_replace()用您之后的值覆盖空白...

$myarray = array(
    4 => 1,
    9 => 1,
    10 => 1,
    1 => 1
);

$blank = array_fill(1, 10, 0);
$result = array_replace ($blank, $myarray);

print_r($result);

哪些输出......

Array
(
    [1] => 1
    [2] => 0
    [3] => 0
    [4] => 1
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 1
    [10] => 1
)

答案 3 :(得分:1)

尝试这个简单的事情

    $array=Array
            (
                [04] => 1
                [09] => 1
                [10] => 1
                [01] => 1
            );

    $myarray=Array
            (
                [01] => 0
                [02] => 0
                [03] => 0
                [04] => 0
                [05] => 0
                [06] => 0
                [07] => 0
                [08] => 0
                [09] => 0
                [10] => 0
            );

    foreach ($array as $key => $value){
        $myarray[$key]=$value;
    }

答案 4 :(得分:1)

您可以使用array_replacearray_fill_keys创建一个预填充数组,其中键为前导零,值为0:

$result = array_replace(
    array_fill_keys(["01", "02", "03", "04", "05", "06", "07", "08", "09", "10"], 0),
    ["04" => 1, "09" => 1, "10" => 1, "01" => 1]
    );
print_r($result)

那会给你:

Array
(
    [01] => 1
    [02] => 0
    [03] => 0
    [04] => 1
    [05] => 0
    [06] => 0
    [07] => 0
    [08] => 0
    [09] => 1
    [10] => 1
)

您还可以使用范围来创建带有键的数组:

$result = array_replace(
    array_fill_keys(
        array_map(
            function ($x) {
                return sprintf("%02d", $x);
            },
            range(1, 10, 1)
        ), 0), ["04" => 1, "09" => 1, "10" => 1, "01" => 1]);

print_r($result);

Demo

答案 5 :(得分:0)

使用功能技术最终会使您的过程看起来很复杂。选择正确解决方案的重要因素应该是省略ksort()调用。如果正确设计了编码解决方案,则可以按照所需的顺序存储数据,从头开始-迭代后无需清理。

代码:(Demo

$data = ["04" => 1, "09" => 1, "10" => 1, "01" => 1];

for ($x = 1; $x < 11; ++$x) {
    $key = sprintf("%02d", $x);  // ensure proper padding with 0
    $result[$key] = $data[$key] ?? 0;  // null coalescing operator from php5.6+
}

print_r($result);

输出:

Array
(
    [01] => 1
    [02] => 0
    [03] => 0
    [04] => 1
    [05] => 0
    [06] => 0
    [07] => 0
    [08] => 0
    [09] => 1
    [10] => 1
)