将缺失的键添加到数组中。

11

我有一个这样的数组,其中一些键缺失:

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个回答

11
与 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);

4
如果省略了ksort($u)并且使用min(...)的代替值为0,则这是最佳答案:键的顺序将得以保留,并且不会假设最大键位于哪里。缺点:性能不确定,而且不是最直观的解决方案。总之:$t + array_fill_keys(range(0,max(array_keys($t))),'') - zamnuts

8

你的问题非常含糊,很难确切地理解你的意思。从我的理解来看,你想将一个键插入到数组中,同时移动当前键沿着索引线。

你可以尝试以下代码:

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
end($array) 返回最后一个 _值_,key() 期望一个数组 -- 这段代码会抛出一个错误:PHP Warning: key() expects parameter 1 to be array, string given - Greg
缺失的键将被添加到数组末尾,因此对生成的数组应用ksort可以对其进行重新排序,这可能会很有用。 - roibeart

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] = '';
    }
}

如果数组键不是按升序排序的呢? - BoltClock
使用foreach循环而不是for循环 - Mr Coder
2
JSON他没有循环数组,他是在循环键的大小,这两者完全不同! - RobertPitt
@BoltClock,如果它们没有按升序排序,那么逻辑就会发生很大变化。如果你想在升序和降序中使用相同的函数 :) 根据例子来看,我认为他想用升序键号来填补一个简单数组中的空白。 - bisko
这里使用 end 没有意义。请使用 max,这样你就可以得到最高的键。 - user5147563

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

2
这个问题很古老了——但是我认为我们可以提供一个三行的解决方案来填充一个数值索引的 $array 中缺失的键,使其具有默认值$defaultVal——而不需要事先对任何内容进行排序,同时仍然能够得到排序后的结果。
此外,我们只需要做与原始数组中的条目数量相同的循环迭代,并且将潜在的更大的缺失索引集的生成留给内部php c-code,它可以优化其函数,比我们优化用户自定义代码要好。
// 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,因为我们知道数组的大小,这样可以显著减少资源的使用。 如果您不想让其他值为null,则必须用显式循环替换array_fill部分来设置SplFixedArray的其他值(遗憾的是,无法传递预填充值给构造函数)。


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

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


这将删除电子邮件地址。 - RobertPitt
@RobertPitt 不,电子邮件地址的键是2 - krtek
在foreach循环中使用while循环吗?双重增加$i呢? - fabrik
@fabrik 带有双递增的情况下,间隔大于一的情况会带来问题。通过这种方式,我们可以有一个10索引的间隔,并且一切都将运行顺利。 - krtek

0

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

$array[1] = ''


如果存在大量的空键,那怎么办? - fabrik
1
我认为他更多地考虑了动态实现这一点。 - Simon H
我是根据他的示例数组进行编写的。 - mikelbring

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

?>

应该可以工作,我刚测试过了...哈哈抱歉,我把测试代码留在里面了。 - Simon H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接