代码之家  ›  专栏  ›  技术社区  ›  hakre

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

  •  5
  • hakre  · 技术社区  · 14 年前

    我正在寻找一种简单的方法来获得一个数组的下一个数值索引,这个索引也是PHP选择的新元素。

    例1:

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

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

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

    这个案子是101。

    例2:

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

    例3:

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

    这个案子是2。

    我现在想知道下一个数字键,PHP也会为数组中的新元素选择,但是如果可能的话,w/o会遍历所有数组值。

    我需要通过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';
    

    5 回复  |  直到 12 年前
        1
  •  3
  •   Matthew    14 年前

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

    <?php
        $x = array(100 => 'foo');
        unset($x[100]);
        $x[] = 'bar';
        var_dump($x);
    ?>
    
    array(1) {
      [101]=>
      string(3) "bar"
    }
    

    如果数组看起来是空的,在添加项之前,无法知道101是下一个整数。

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

        2
  •  12
  •   shamittomar    14 年前

    方法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

        3
  •  7
  •   Sjoerd    14 年前

    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;
        }
        ...
     }
    
        4
  •  1
  •   Mor    14 年前

        5
  •  0
  •   Casey Chu    14 年前

    如果所有这些都失败了,您可以简单地对一个副本进行测试。

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