在PHP中填充数组n-in-n值

时间:2015-03-18 02:19:36

标签: php arrays

例如,我有一个包含N元素的数组,我需要它有M个元素,其中MO的倍数。例如:

[signature: array array_fill_multiple(array, int o, mixed filler = null)]

$array = [ 1, 2 ];
array_fill_multiple($array, 1); // => [ 1, 2 ]
array_fill_multiple($array, 2); // => [ 1, 2 ]
array_fill_multiple($array, 3); // => [ 1, 2, null ]
array_fill_multiple($array, 4); // => [ 1, 2, null, null ]

$array = [ 1, 2, 3 ];
array_fill_multiple($array, 1); // => [ 1, 2, 3 ]
array_fill_multiple($array, 2); // => [ 1, 2, 3, null ]
array_fill_multiple($array, 3); // => [ 1, 2, 3 ]
array_fill_multiple($array, 4); // => [ 1, 2, 3, null ]

$array = [ 1, 2, 3, 4 ];
array_fill_multiple($array, 5, 0); // => [ 1, 2, 3, 4, 0 ]

我可以用for来做,但我想使用原生方法是可能的,不是吗?

修改

为了更好地解释我想要的东西,它需要产生一个具有O个元素倍数的数组。因此,如果我喜欢这个数组包含5的倍数,那么它需要产生一个包含0,5,10,15,20,25 ......元素的数组(包括零,如果为空)。

  • 如果我的数组有15个元素,并且我期望2的倍数,那么它将适合下一个2或等于15的倍数,或者是16,因此只会创建1个填充。
  • 如果我的数组有3个元素,并且我期望5的倍数,那么它将适合5的下一个倍数,等于3,或者是5,或者是自己的5.这样就会创建2个填充。
  • 如果我的数组有10个元素并且我期望10个的倍数,那么它将适合10的下一个倍数,或者igual到10之后,或者是10个,或者是自己的10.因此我的数组还没有填充是10的倍数。
  • 如果我的数组为空,它将返回一个空数组。

我想array_pad()会有所帮助。只需要根据数组计算计算第二个参数,以了解O的下一个倍数。

2 个答案:

答案 0 :(得分:1)

基本上你只需将“array_fill_multiple”替换为“array_pad”,它就会起作用:)

$array = [ 1, 2 ];
array_pad($array, 1, null); // => [ 1, 2 ]
array_pad($array, 2, null); // => [ 1, 2 ]
array_pad($array, 3, null); // => [ 1, 2, null ]
array_pad($array, 4, null); // => [ 1, 2, null, null ]

$array = [ 1, 2, 3 ];
array_pad($array, 1, null); // => [ 1, 2, 3 ]
array_pad($array, 2, null); // => [ 1, 2, 3, null ]
array_pad($array, 3, null); // => [ 1, 2, 3 ]
array_pad($array, 4, null); // => [ 1, 2, 3, null ]

$array = [ 1, 2, 3, 4 ];
array_pad($array, 5, 0); // => [ 1, 2, 3, 4, 0 ]

答案 1 :(得分:1)

像这样的东西

$a = [1, 2, 3];
$multiple = 5;
$size = sizeof($a);

// first way
var_dump(array_pad($a, ceil($size / $multiple) * $multiple, null));

// second way
var_dump(array_pad($a, $size + ($size % $multiple ? $multiple - $size % $multiple : 0), null));

第二个比第一个更准确。假设你有一个包含10000000000000001个项目的数组(在64系统上)。现在你必须用乘法器11填充。

$size = 10000000000000001 * 11;
$multiple = 11;
var_dump($size);
// int(110000000000000011)

// first way
ini_set('precision', 18);
var_dump(ceil($size / $multiple) * $multiple);
// double(110000000000000000)

// second way
var_dump($size + ($size % $multiple ? $multiple - $size % $multiple : 0));
// int(110000000000000011)

现在您看到第一种方法产生错误的值,因为浮点值的精度低于int。