2010-07-29 84 views
121

我有一個關聯數組,我需要找到一個鍵的數字位置。 我可以通過手動循環查找數組,但有沒有更好的方法構建到PHP中?php - 獲取關聯數組的數字索引

$a = array(
    'blue' => 'nice', 
    'car' => 'fast', 
    'number' => 'none' 
); 

// echo (find numeric index of $a['car']); // output: 1 

回答

201
echo array_search("car",array_keys($a)); 
+2

PHP是否保證關聯數組的順序? – 2012-05-01 21:50:52

+4

@KevinBurke除非使用排序功能,否則不會重新排序它。不知道你在尋找什麼樣的保證,但它不像JavaScript模型那樣沒有關聯數組的靜態順序。 – Fosco 2012-05-01 23:20:45

+4

「array_keys」給出的索引不一定匹配原始數組的索引。例如,如果通過使用「unset」或其他許多函數來更改數組,則原始數組的索引中將留有間隙,但array_keys將生成一個新數組。 – SEoF 2013-02-13 14:49:22

0

一個解決方案,我想出了...可能非常低效相比壽Fosco的解決方案:

protected function getFirstPosition(array$array, $content, $key = true) { 

    $index = 0; 
    if ($key) { 
    foreach ($array as $key => $value) { 
    if ($key == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } else { 
    foreach ($array as $key => $value) { 
    if ($value == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } 
} 
+2

是的,由於某種原因PHP有數千個內置函數。這些*通常*比在PHP代碼中寫出很長的等價邏輯要快得多。 – 2010-07-29 18:37:13

+3

這可能比'array_search'快,它首先進行排序,所以速度很慢。 – Alasdair 2012-01-25 05:55:25

+0

啊,但內置的代碼是預編譯的,搜索很可能是二分搜索(假設它首先進行分類)。 – SEoF 2013-02-13 14:42:20

1

    $a = array(
     'blue' => 'nice', 
     'car' => 'fast', 
     'number' => 'none' 
); 
var_dump(array_search('car', array_keys($a))); 
var_dump(array_search('blue', array_keys($a))); 
var_dump(array_search('number', array_keys($a))); 
 
3
function arrayValuePosition($value, $array) 
{ 
    return array_search($value, array_keys($array)); 
} 
0

儘管Fosco的回答沒有錯,但有一個案例被認爲是與這一個:混合陣列。想象一下,我有一個這樣的數組:

$a = array(
    "nice", 
    "car" => "fast", 
    "none" 
); 

現在,PHP允許這種語法,但它有一個問題:如果我跑Fosco的代碼,我得到0這是我的錯,但爲什麼出現這種情況?做字符串和整數PHP字符串轉換爲整數(這在我看來有點傻)之間進行比較時,
因爲如此,當array_search()搜索索引停靠在第一個,因爲顯然("car" == 0)是真的
設置array_search()以嚴格的方式並不能解決問題,因爲那麼array_search("0", array_keys($a))將返回即使索引爲0的元素存在虛假。
所以我的解決方案只是將來自array_keys()爲字符串的所有索引,然後將它們正確地進行比較:

echo array_search("car", array_map("strval", array_keys($a))); 

打印1這是正確的

+0

當傳遞一個變量時,你也應該把它轉換爲一個字符串,因爲將零傳遞給一個關聯數組會產生相同的負面影響。例如:'var_dump(array_search(0,array_map(「strval」,array_keys($ a))));'將總是輸出'int(0)',而不是'bool(false)'。 – 2018-03-07 02:02:10