将缺少的键添加到数组中

时间:2011-03-16 14:06:54

标签: php arrays

我有一个像这样的数组,缺少键:

array(2) {
  [0]=>
  string(4) "Bill"
  [2]=>
  string(13) "billy@kid.com"
}

如何使用空字符串作为值添加缺失键?我希望这样做:

array(3) {
  [0]=>
  string(4) "Bill"
  [1]=>
  string(0) ""
  [2]=>
  string(13) "billy@kid.com"
}

8 个答案:

答案 0 :(得分:7)

你的问题很模糊,很难理解你想要什么,从我的解释来看,你似乎想要在数组中插入一个键来移动索引线上的当前键。

你可能想尝试这样的事情:

function cleanArray(&$array)
{
    end($array);
    $max = key($array); //Get the final key as max!
    for($i = 0; $i < $max; $i++)
    {
        if(!isset($array[$i]))
        {
            $array[$i] = '';
        }
    }
}

cleanArray($array);

答案 1 :(得分:7)

与Rinuwise的答案类似:

$t = array( 0 => "Bill",
            2 => "billy@kid.com"
          );


$u = $t + array_fill_keys( range(min(array_keys($t)),
                                 max(array_keys($t))
                                ),
                           ''
                           );

ksort($u);

var_dump($u);

答案 2 :(得分:6)

如果要自动设置空键,可以执行

$keys = array_keys($array);

$maxkey = end($keys); // it will fill only the values between 0 and last key

for ($i = 0; $i < $maxkey; $i++) {
    if (!array_key_exists($i, $array)) {
        $array[$i] = '';
    }
}

答案 3 :(得分:5)

这里有一个不同的答案,如何在没有循环的情况下利用数组求和运算符。

<?php

$array = array(
    0 => "Bill",
    2 => "billy@kid.com",
);

// If min and max are static, use numbers instead of getting them from the array
$keys = array_keys($array);
$all = array_fill(min($keys), max($keys) - min($keys) + 1, "");
$filled = $array + $all;

// If you want keys in order
ksort($filled);

var_dump($filled);

答案 4 :(得分:1)

像所有其他数组做法一样:

$myarray[1] = "";

或者,如果你的意思是填补数组中的空白:

$i = 0;
ksort($myarray);
foreach($myarray as $k => $v) {
    while($i < $k) {
        // if $i < $k we're missing some keys.
        $myarray[$i] = '';
        $i ++;
    }
    $i++;
}
ksort($myarray);

编辑:添加排序以避免删除值。

答案 5 :(得分:1)

这个问题已经很老了 - 但我认为我们可以做得比给定的答案好一点,通过提供三行解决方案来用 $array 填充数字索引的 $defaultVal - 无需先对任何内容进行排序 - 并且仍然得到排序结果。

此外,我们只执行与原始数组中的条目一样多的循环迭代 - 并将可能更大的缺失索引集的生成留给内部 php c 代码,它可以比我们更好地优化其功能可以优化我们的用户态代码。

// array_fill generates a sorted array,
// we merely overwrite its values at certain indices.
// Thus, $newArray will end up sorted,
// even if $array wasn't

$newArray = array_fill(0, max(array_keys($array)), $defaultVal);
foreach ($array as $key => $val) {
    $newArray[$key] = $val;
}

如果您在巨大数组或大量迭代的上下文中需要这样的东西 - 您也可以从使用 SplFixedArray 中受益,我们可以使用它,因为我们知道数组的大小 - 这非常重要更加资源友好。如果您不想将 SplFixedArray 的其他值设置为 array_fill,则必须通过显式循环替换 null 部分(遗憾的是,不能将 prefillValue 传递给构造函数) ).

答案 6 :(得分:0)

您可以根据键定义数组值。

$array[1] = ''

答案 7 :(得分:0)

    <?php

function array_fill_empty($array, $default = "") {
    if(!is_array($array)) return array();
    for($i = 0; $i < count($array); $i++) {
        if(!isset($array[$i])) $array[$i] = $default;
    }
    return $array;
}

$array1 = array(0 => 'Bill', 2 => 'billy@kid.com');
$array1 = array_fill_empty($array1);
var_dump($array1);

?>