【问题标题】:PHP get index of last inserted item in arrayPHP获取数组中最后插入项的索引
【发布时间】:2011-03-17 13:08:46
【问题描述】:

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

$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 是有缺陷的。

【问题讨论】:

    标签: php arrays indexing


    【解决方案1】:

    您可以使用end() 函数获取数组中的最后一个元素,并使用array_keys() 返回数组键的数组。令人困惑。在实践中,它是这样工作的:

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

    cmets 的功劳归于 hollsk。

    【讨论】:

    • 返回值,而不是索引。对于具有多个非唯一值的数组,这是行不通的。
    • -1 您不应将值传递给end。这引发了严格的警告。正确答案是 VolkerK 给出的答案:end($array); key($array);
    • end 函数将数组作为其第一个也是唯一的参数,array_keys 函数返回一个数组。此代码完全有效。
    • @Sam152 不,end 通过引用获取一个数组。您不能通过引用直接传递函数的结果,因此会出现警告。
    • @Christian,这将由$key = end($keys = array_keys($array)); 解决。如果您正在循环通过 $array 并因此不想重置指针,这是一个很好的解决方案。
    【解决方案2】:

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

    $last_id = array_pop(array_keys($a));
    

    【讨论】:

    • 你确定这是你想要的吗? array_pop 会将项目从数组中弹出,然后返回它的值,如果您以后需要完整的数组来做其他事情,这可能没有帮助。以 array_keys 结尾会做你想做的事,同时让你的数组不受干扰。
    • 这适用于与 $a 不同的数组。 array_keys() 返回一个新数组,我可以随意使用它,因为这个数组是完全临时的。也许您应该查看有关 array_keys() 的文档?
    • 这会触发E_STRICT 消息,因为array_pop() 需要通过引用传递变量。
    • @MrWhite 真的!我尝试在调用中分配一个变量(例如array_pop($_ = array_keys($a))),但它也不起作用。唯一的解决方案是错误抑制运算符(有点丑但有点合理):@array_pop(array_keys($a))
    【解决方案3】:

    如果您只使用数组的数字索引,则最后一个自动生成的索引将始终是数组的最大数组键。

    因此,对于自动生成的索引,使用 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
    )
    


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

    【讨论】:

    • 这就是我提供第二个示例的原因。我明确指出有可能设置键,无论是否为整数。抱歉下次好运;-)
    • 嗯,它适用于你的第二个例子;-);;但是,好的,这只是因为您添加了一个具有“正确”值的数字索引:-(
    【解决方案4】:

    您可以将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
    

    【讨论】:

    • 您的解决方案与选择的答案相同,但更详细。人们显然懒得阅读更好的答案。
    【解决方案5】:

    这是linear最快)解决方案:

    end($a);
    $last_id=key($a);
    

    【讨论】:

    • 不错的一个!如果您使用[],是否需要end($)?我注意到没有它也可以工作
    • 不幸的是。一个简单的测试表明,$array[] = $value; 操作没有将数组的内部指针设置在它的末尾。它停留在最后一个resetnextend 或类似操作设置它的位置。或者如果它是一个附加了新值的新数组,则在位置 0。
    • 在我看来这是件好事。您可以遍历 $array 并同时向其添加更多值。抱歉跑题了。
    【解决方案6】:

    在具有从 0 到 n-1 的数字键的数组上,我总是使用:

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

    我猜它并没有变得更快或更简单。如果有人得到了适用于其他数组的类似内容,请告诉我。

    【讨论】:

    • 我知道它不适合您的特殊需求,但我是通过搜索谷歌来到这里的,并认为其他人以同样的方式来到这里会很高兴找到它;)
    • -1 这个答案是错误的。 array_push 返回数组中新的 count 个元素。您的方法只有在没有丢失键的情况下才有效。
    • @Waldermort 当然我有这个限制,这就是为什么我写了“在具有从 0 到 n-1 的数字键的数组上”。这并没有错。也许我应该更清楚地说明这一点;)
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 2012-05-13
    • 2014-09-27
    • 2017-06-21
    • 2015-01-27
    • 2020-12-20
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多