2010-07-18 43 views
46

它与标题听起来一样简单;我需要获取最后插入项目的索引/键。为什么这很难?请参阅下面的两个代码示例:PHP获取数组中最后一个插入项目的索引

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

回答

61

这里是一个linear最快)溶液:

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

这确实更快。 – Christian 2012-04-06 21:06:33

+1

不错!如果使用'[]',是否需要'end($)'? – 2013-05-04 15:18:15

+2

不幸的是,一个简单的测试表明,'$ array [] = $ value;'操作不会在数组的末尾设置数组的内部指针。停留在最后一个'reset','next','end'或类似操作设置的位置,或者在位置0,如果它是一个新的数组,并且附加了新的值 – SWilk 2013-05-15 14:18:27

18

您可以使用end()函数获取数组中的最后一个元素,并使用array_keys()返回数组键。混乱。实际上,它的工作原理是这样的:

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

Credit在评论中转到hollsk。

+0

返回的值,而不是指数。对于具有多个非唯一值的数组,这是行不通的。 – Christian 2010-07-18 10:11:05

+6

当然可以。 $ key = end(array_keys($ array)); – hollsk 2010-07-18 10:12:13

+8

-1您不应该将值传递给'end'。这引发了严格的警告。正确答案是VolkerK给出的答案:'end($ array);键($阵列);'。 – Artefacto 2010-07-18 13:32:27

1

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

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

你确定这是你想要的吗? array_pop会将该项目从数组中弹出,然后返回它的值,如果您以后需要完整的数组,则可能无益。以array_keys结尾将做你想做的事情,同时让你的阵列不受干扰。 – hollsk 2010-07-18 11:09:11

+0

与$ a不同的数组可以工作。 array_keys()返回一个新的数组,我可以自由地做我想做的事情,因为这个数组完全是临时的。也许你应该检查array_keys()上的文档? – Christian 2010-07-18 13:27:59

+1

这会触发'E_STRICT'消息,因为array_pop()需要一个变量通过引用传递。 – MrWhite 2014-03-21 01:28:41

2

如果你只为您的数组索引数值工作,最后自动生成的索引永远是最大的阵列关键阵列。

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


但是请注意,这将不适合的情况下工作时,你是一个指定索引...

+0

这就是我提供第二个例子的原因。我明确指出了设置密钥的可能性,无论是否为整数。对不起下次更好运气;-) – Christian 2010-07-18 10:13:23

+0

嗯,它的工作,你的第二个例子;-) ;;但是,好吧,它只能工作,因为你已经添加了一个数字索引,并带有“正确”的值:-( – 2010-07-18 10:15:18

19

您可以使用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 
1

在具有从0数字键阵列到n-1 I总是使用:

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

它没有得到我猜更快或更简单。如果有人得到了类似于其他阵列的东西,请告诉我。

+0

呃...只是阅读其他答案.. – Christian 2014-01-23 21:42:14

+1

我知道它不适合您的特殊需求,但我是通过搜索google来到这里的并认为有人以同样的方式来到这里会是p租用找到它;) – Christoph 2014-01-26 00:15:07

+1

-1这个答案是错误的。 'array_push'返回数组中元素的新**数**。你的方法只有在没有丢失键的情况下才有效。 – Twifty 2014-05-06 11:55:05

0

如果您想索引只是为了获取最后插入的项目。

使用功能,只需使用:

return $array[] = $value; 
+0

这不起作用,因为我上面的示例代码显示。该表达式将返回值,而不是关键字。我也试过了,万一我遗失了一些东西:https://3v4l.org/96q2t – Christian 2017-12-10 21:03:52

相关问题