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

Posted

技术标签:

【中文标题】PHP获取数组中最后插入项的索引【英文标题】:PHP get index of last inserted item in array 【发布时间】: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 是有缺陷的。

【问题讨论】:

【参考方案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 的数字键的数组上”。这并没有错。也许我应该更清楚地说明这一点;)

以上是关于PHP获取数组中最后插入项的索引的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何获取数组过滤项的索引

获取GridView中插入的最后一行的索引

php 获取数组第一个key 第一个键值对 等等

获取数组第一项的最快方法是啥? [复制]

为啥我无法在 PHP 和 MySQL 中获取最后一个插入 ID?

如何获取数组Objective-C中每个项目的索引