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

PHP获取数组中最后一个插入项的索引

  •  50
  • Christian  · 技术社区  · 16 年前

    就像标题听起来一样简单;我需要得到最后一个插入项的索引/键。为什么这么难?请参见以下两个代码示例:

    $a=array();
    echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
    echo 'res='.($a[]='bbb').' - '.(count($a)-1).'<br>';
    echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
    die('<pre>'.print_r($a,true).'</pre>');
    

    写入:

    res=aaa - 0
    res=bbb - 1
    res=aaa - 2
    Array (
        [0] => aaa
        [1] => bbb
        [2] => aaa
    )
    

    当然,这似乎很管用,但看看这个:

    $a=array();
    echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
    echo 'res='.($a[2]='bbb').' - '.(count($a)-1).'<br>';
    echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
    die('<pre>'.print_r($a,true).'</pre>');
    

    写入:

    res=aaa - 0
    res=bbb - 1       <- wrong!
    res=aaa - 2       <- wrong!
    Array (
        [0] => aaa
        [2] => bbb    <- real key
        [3] => aaa    <- real key
    )
    

    总之,流行的解决方法 count($array)-1 是有缺陷的。

    6 回复  |  直到 13 年前
        1
  •  71
  •   romaninsh    12 年前

    这是一个 linear ( 最快的 )解决方案:

    end($a);
    $last_id=key($a);
    
        2
  •  21
  •   VolkerK    16 年前

    key($a) 一起 end($a)

    $a=array();
    $a[]='aaa'; foo($a);
    $a[3]='bbb'; foo($a);
    $a['foo']='ccc'; foo($a);
    $a[]='ddd'; foo($a);
    
    function foo(array $a) {
      end($a);
      echo 'count: ', count($a), ' last key: ', key($a), "\n";
    }
    

    count: 1 last key: 0
    count: 2 last key: 3
    count: 3 last key: foo
    count: 4 last key: 4
    
        3
  •  19
  •   Sam Becker    16 年前

    你可以用 end() array_keys() 返回数组键的数组。令人困惑。实际上,它是这样工作的:

    $key = end(array_keys($array));
    

        4
  •  2
  •   Pascal MARTIN    16 年前

    如果只处理数组的数字索引,则最后自动生成的索引将始终是数组中最大的数组键。

    对于自动生成的索引,使用 max(array_keys($a)) 应该有用。

    例如:

    $a=array();
    echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>';
    echo 'res='.($a[2]='bbb').' - '.(max(array_keys($a))).'<br>';
    echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>';
    die('<pre>'.print_r($a,true).'</pre>');
    

    会让你:

    res=aaa - 0
    res=bbb - 2
    res=aaa - 3
    
    Array
    (
        [0] => aaa
        [2] => bbb
        [3] => aaa
    )
    


    但请注意,这将不适用于指定索引的情况。。。

        5
  •  0
  •   Christian    12 年前

    呸,看来我自己找到了答案:

    $last_id = array_pop(array_keys($a));
    
        6
  •  0
  •   Christoph Diegelmann    12 年前

    在数字键从0到n-1的数组上,我始终使用:

    $key = array_push($array, $value)-1;