2017-08-30 140 views
1

想象我有此数组:PHP - 基于其他参数的值获取多维数组值

Array 
(
    [0] => Array 
     (
      [email] => [email protected] 
      [name] => a 
     ) 

    [1] => Array 
     (
      [email] => [email protected] 
      [name] => b 
     ) 
) 

我使用此代码来检查,如果在这个多阵列存在我的邮箱:

in_array($user->user_email, array_column($array, 'email')) 

现在,我的问题是:如何获取参数'name'的值,其中电子邮件与我的变量匹配。 所以,如果我的$用户> USER_EMAIL等于“[email protected]”我需要的名称值,这是“A”。 它可能在PHP?

+2

使用['array_search()'](http://php.net/manual/en/function.array-search.php)或['array_keys()'] (http://php.net/manual/en/function.array-keys.php),而不是'in_array()'找到匹配的项目的位置(一个或多个)。 – axiac

+0

感谢@axiac,array_search()正是我一直在寻找的。 –

回答

2

试试这个:

$index = array_search($user->user_email, array_column($array, 'email')); 
if ($index !== false) $name = $array[$index]['name']; 

这依赖于运行时通过阵列蜜饯array_column,我相信,在提取项目的顺序创建的事实。 Ergo,从这个数组读取的索引可以用来引用原始数组。

2

非但没有列,然后搜索该数组为您email的。你可以这样做。 array_column第二个参数定义了结果数组的关键字。此方法减少了数组中搜索数据的工作量。

Try this code snippet here

$user_email="[email protected]"; 

$result=array_column($array,"name","email"); 

if(isset($result[$user_email])){ 
    echo "Name is: ".$result[$user_email];//Name is: a 
} 

如果你print_r($result)你会得到。

Array 
(
    [[email protected]] => a 
    [[email protected]] => b 
) 
+1

这个应该是答案,它很整齐。 – Yarco

0
$name = ""; 

foreach($array as $key => $value) 
{ 
    if($value["email"] == $user->user_email) 
    { 
     $name = $array[$key]["name"]; 
    } 

} 
+1

'$ name = $ value ['name'];'更快,更清晰。之后你也可以放一个'break'。 – axiac

0

使用array_search insted的的in_array

$array = [ 
    [ 
     'email' => '[email protected]', 
     'name' => 'a' 
    ], [ 
     'email' => '[email protected]', 
     'name' => 'b' 
    ] 
]; 

$index = array_search('[email protected]', array_column($array, 'email')); 

// when there is no such value, $index will be equal 'false' 
var_dump($index); // int(1) 
0

试试这个;

$name = $array[array_keys(array_column($array, 'email'), $user->user_email)[0]]['name']; 

PD:(此代码只得到搜索的第一个元素)

0

你可以做到这一点作为一个衬垫,但它不是很好,很难IMO阅读:

array_column($array, 'name')[($result = array_search('[email protected]', array_column($array, 'email'))) ?: (is_int($result)? $result : -1)]; 

同如上但格式化为可读性:

array_column($array, 'name')[ 
    (
     $result = array_search(
      '[email protected]', 
      array_column($array, 'email') 
     ) 
    ) 
    ?: 
    (
     is_int($result)? $result : -1 
    ) 
]; 

这通过名称的阵列的-1,如果array_search收率š假以避免不存在的邮件和[email protected]两个归国a由于false被评价为0

这样,如果电子邮件地址不存在你会得到一个Undefined offset通知,以便电子邮件实际上变成了名的数组的关键。

但一次。不大好。相反,考虑这样的功能:

function customArraySearch($array, $search_column, $search_value, $result_column) { 
    $result = array_search($search_value, array_column($array, $search_column)); 

    if($result_key !== false) { 
     return array_column($array, $result_column)[$result_key] 
    } 
    return false; 
} 
customArraySearch($array, 'email', '[email protected]', 'name'); //a 
customArraySearch($array, 'email', '[email protected]', 'name'); //false