如何查找现有数组的下一个数字索引?

时间:2010-09-13 08:13:25

标签: php arrays

我正在寻找一种简单的方法来获取一个新元素的数组的下一个数字索引,该元素也可以由PHP选择。

示例1:

$array = array();
$array[] = 'new index';

对于这种情况,这将是0。

示例1a:

$array = array(100 => 'prefill 1');
unset($x[100]);
$x[] = 'new index';

对于这种情况,这将是101。

示例2:

$array = array(-2 => 'prefill 1' );
$array[] = 'new index';

对于这种情况,这将再次为0。

示例3:

$array = array(-2 => 'prefill 1', 1 => 'prefill 2' );
$array[] = 'new index';

对于这种情况,这将是2。

我现在想知道PHP为数组中的新元素选择的下一个数字键,但如果可能的话,不会迭代所有数组值。

我需要通过SPL实现自己的数组实现,如果添加了一个新元素,则应该模仿PHP的默认行为,而无需指定偏移量。

示例4:

$array = array(-2 => 'prefill 1', 'str-key-1' => 'prefill 2', 1 => 'prefill 3' , 'str-key-2' => 'prefill 4');
$array[] = 'new index';

对于这种情况,这将是2。

示例5:

$array = array(-2 => 'prefill-1', 'str-key-1' => 'prefill-2', 1 => 'prefill-3' , '5667 str-key-2' => 'prefill-4');
$array[] = 'new index';

对于这种情况,这也是2。

更新:我添加了更多示例来展示一些边缘情况。

5 个答案:

答案 0 :(得分:12)

方法1:

使用end将阵列推进到最后。获取该项目的key。最后,添加1以获取下一个项目的索引。像这样:

$array [ ] = 'I';
$array [4] = 'Like';
$array [ ] = 'Turtles';

end($array);
$last = key($array);
$nextindex = $last + 1;

echo $nextindex;

输出:

  

6

此方法在最后一个索引不是最大或字符串(在注释中指出)的情况​​下失败。因此,在这些情况下,有更好的方法2


方法2:

此方法适用于基于负数和字符串的索引:
您可以array_keys获取max,然后+1。像这样:

 $array = array(-2 => 'prefill 1', 'str-key-1' => 'prefill 2', 1 => 'prefill 3' , 'str-key-2' => 'prefill 4');
 echo max(array_keys($array)) + 1;

输出正确:

  

2

答案 1 :(得分:6)

zend哈希表有一个元素nNextFreeElement,其中包含您要查找的数字。每次添加项目时,此字段都会更新为自身的最大值和索引+ 1

ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
{
    ...
    if ((long)h >= (long)ht->nNextFreeElement) {
            ht->nNextFreeElement = h < LONG_MAX ? h + 1 : LONG_MAX;
    }
    ...
 }

答案 2 :(得分:3)

我认为必要的信息不会暴露给PHP脚本。考虑:

<?php
    $x = array(100 => 'foo');
    unset($x[100]);
    $x[] = 'bar';
    var_dump($x);
?>

array(1) {
  [101]=>
  string(3) "bar"
}

在添加项目之前,没有办法知道101是看似空的数组的下一个整数。

如果从头开始构建自己的数组类,那么可以通过私有成员变量跟踪下一个索引。

答案 3 :(得分:1)

在我看来,PHP在索引值的最大值之后取下一个正数。

答案 4 :(得分:0)

如果所有其他方法都失败了,您只需测试副本即可。

// Since PHP passes by copy, we don't even need to explicitly copy.
function get_next_key($copy) {
    $copy[] = 'blah';
    end($copy);
    return key($copy);
}

$key = get_next_key($array);