2010-07-18 67 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

相關問題