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;
操作没有将数组的内部指针设置在它的末尾。它停留在最后一个reset
、next
、end
或类似操作设置它的位置。或者如果它是一个附加了新值的新数组,则在位置 0。
在我看来这是件好事。您可以遍历 $array 并同时向其添加更多值。抱歉跑题了。【参考方案6】:
在具有从 0 到 n-1 的数字键的数组上,我总是使用:
$key = array_push($array, $value)-1;
我猜它并没有变得更快或更简单。如果有人得到了适用于其他数组的类似内容,请告诉我。
【讨论】:
我知道它不适合您的特殊需求,但我是通过搜索谷歌来到这里的,并认为其他人以同样的方式来到这里会很高兴找到它;) -1 这个答案是错误的。array_push
返回数组中新的 count 个元素。您的方法只有在没有丢失键的情况下才有效。
@Waldermort 当然我有这个限制,这就是为什么我写了“在具有从 0 到 n-1 的数字键的数组上”。这并没有错。也许我应该更清楚地说明这一点;)以上是关于PHP获取数组中最后插入项的索引的主要内容,如果未能解决你的问题,请参考以下文章