2017-08-30 139 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