2015-11-05 421 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]; 
}