2011-06-18 21 views
34

我有這樣一個數組:PHP - 獲取數組值以數字指標

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
echo native_function($array, 0); // bar 
echo native_function($array, 1); // bin 
echo native_function($array, 2); // ipsum 

所以,這個本地函數將返回基於數字索引(第二ARG)的值,忽略assoc命令鍵,尋找陣列中的真實位置。

是否有任何原生函數在PHP中執行該操作,還是應該編寫它? 感謝

+3

這聽起來像個壞主意。你需要做什麼?在這種情況下實際使用數字鍵並將'foo'值作爲子數組的成員是否會更好? –

+0

我也覺得,這看起來很糟糕的設計。你能告訴我們你想做什麼嗎?也許有更好的解決方案。 – Alp

回答

11

array_values()會做幾乎你想要什麼:

$numeric_indexed_array = array_values($your_array); 
// $numeric_indexed_array = array('bar', 'bin', 'ipsum'); 
print($numeric_indexed_array[0]); // bar 
+0

......並且,從PHP 5.4起,將其壓縮到:print(array_values($ your_array)[0]); – Pancho

77
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
$array = array_values($array); 
echo $array[0]; //bar 
echo $array[1]; //bin 
echo $array[2]; //ipsum 
4

是的,對於標量值的implodearray_slice組合會做:

$bar = implode(array_slice($array, 0, 1)); 
$bin = implode(array_slice($array, 1, 1)); 
$ipsum = implode(array_slice($array, 2, 1)); 

還是混了與array_valueslist(謝謝@nikic),以便它可以處理所有類型的值:

list($bar) = array_values(array_slice($array, 0, 1)); 
+0

+1雖然我會使用'list($ bar)= array_slice($ array,0,1)'去除標量值限制;) – NikiC

+0

@nikic:我想到了,不幸的是'array_slice'會保存字符串鍵(即使* preserve_keys *爲* false *),所以你不能在這種情況下使用'list',除非你'array_values'結果數組。無論如何,我想這也是一個解決方案,編輯。謝謝。 – netcoder

4

我建議我對它的任何缺點array_values()函數的想法,因爲我認爲這不是一個直接獲取函數。 通過這種方式,它必須創建數值索引數組值的副本,然後進行訪問。如果PHP沒有隱藏自動翻譯所需元素位置的整數的方法,也許稍微好一些的解決方案可能包含一個函數,該函數用計數器運行數組,直到它到達所需的位置,然後返回到達的元素。

因此,該工作將針對非常大的尺寸陣列進行優化,因爲該算法對於較小的表現是最佳的指標,立即停止。然而,在array_values()高亮顯示的解決方案中,它必須處理流經整個陣列的循環,即使例如我必須訪問$ array [1]。

function array_get_by_index($index, $array) { 

    $i=0; 
    foreach ($array as $value) { 
     if($i==$index) { 
      return $value; 
     } 
     $i++; 
    } 
    // may be $index exceedes size of $array. In this case NULL is returned. 
    return NULL; 
} 
+0

但是如果'false'會被提取的值呢?返回'null'仍然不好,但比'false'好。 – user619271

+0

考慮到類型的一致性,我會得到NULL值,或者輸入索引超出數組大小,或者索引輸入的目標值爲NULL。在這種情況下,我同意你的看法。然而,FALSE和NULL在函數empty()上給出了相同的結果,這將是下一次檢查將在任何情況下執行的結果,因此調用此函數是有意義的。 –