2015-11-05 135 views
1

我想要搜索2維數組,但我只想在第二維中的特定字段中進行搜索。如果找到了,我想返回密鑰。沒有必要從那裏繼續,我只需要第一次出現,但我不介意讓所有的出現。PHP:在二維數組中搜索,但僅查找特定鍵

的陣列可能是這樣的:

$array = [ 
    0 => ['value' => 'x', 'foo' => 'bar'], 
    1 => ['value' => 'y', 'foo' => 'bar'], 
    2 => ['value' => 'z', 'foo' => 'x'], 
]; 

現在我首先想到的是這樣的:

function myCustomArraySearch($array, $searchkey, $searchvalue) { 
    foreach ($array as $key => $value) { 
     if ($value[$searchkey] == $searchvalue) { 
      return $key; 
     } 
    } 
    return false; 
} 

echo myCustomArraySearch($array, 'value', 'x'); 

我敢肯定,還有一個更elegnt解決方案。有任何想法嗎?

+0

嘗試'array_walk_recursive'內置PHP函數的http:// php.net/manual/ro/function.array-walk-recursive.php –

回答

4

這裏是一個返回單個密鑰的一種方式:

$result = array_search('x', array_column($array, 'value')); 

這將返回多個鍵:

$result = array_keys(array_column($array, 'value'), 'x'); 

如果沒有> = 5.5.0 PHP需要爲array_column()然後使用它在它的地方:

array_map(function($v) { return $v['value']; }, $array) 
+0

這裏接縫是一個小的錯字: array_map(function($ v){return $ v ['value'];},$ array) –

+0

是的,已編輯。謝謝。 – AbraCadaver

2

下面的函數返回第一個發生的位置倫斯:

1 - 使用foreach迭代和array_serach

function search1($array, $key, $value) { 
    foreach ($array as $k => $arr) { 
     if (array_search($value, $arr) != false) { 
      return $k; 
     } 
    } 
    return false; 
} 

2 - 使用array_maparray_key_existsarray_search

function search2($array, $key, $value) { 
    $mapped = array_map(function($arr) use ($key, $value) { 
     return (array_key_exists($key, $arr) && $arr[$key] == $value) 
       ? true 
       : false; 
    }, 
    $array);  

    return array_search(true, $mapped); 
} 
2

你的代碼工作正常,所以這段代碼只是用少一行來做。只適用於PHP 5.5+。

function myCustomArraySearch($array, $searchkey, $searchvalue) { 
    $cols = array_column($array, $searchkey); 
    $result = array_search($searchvalue, $cols); 
    return $result; 
} 

當然,如果你想返回數組就發現不只是你將只返回像這樣的指標:

function myCustomArraySearch($array, $searchkey, $searchvalue) { 
    $cols = array_column($array, $searchkey); 
    $result = array_search($searchvalue, $cols); 
    return $array[$result]; 
}