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

hak*_*kre 5 php arrays

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

例1:

$array = array();
$array[] = 'new index';
Run Code Online (Sandbox Code Playgroud)

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

例1a:

$array = array(100 => 'prefill 1');
unset($x[100]);
$x[] = 'new index';
Run Code Online (Sandbox Code Playgroud)

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

例2:

$array = array(-2 => 'prefill 1' );
$array[] = 'new index';
Run Code Online (Sandbox Code Playgroud)

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

例3:

$array = array(-2 => 'prefill 1', 1 => 'prefill 2' );
$array[] = 'new index';
Run Code Online (Sandbox Code Playgroud)

对于这种情况,这将是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';
Run Code Online (Sandbox Code Playgroud)

对于这种情况,这将再次为2.

例5:

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

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

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

sha*_*mar 12

方法1:

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

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

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

echo $nextindex;
Run Code Online (Sandbox Code Playgroud)

这输出:

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;
Run Code Online (Sandbox Code Playgroud)

这输出正确:

2


Sjo*_*erd 7

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;
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)


Mat*_*hew 3

我认为 PHP 脚本没有公开必要的信息。考虑:

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

array(1) {
  [101]=>
  string(3) "bar"
}
Run Code Online (Sandbox Code Playgroud)

考虑到看似空的数组,在添加该项目之前,我们无法知道 101 是下一个整数。

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