2017-06-10 7 views
0

サブレベルの1つの値に基づいて多次元配列の第1レベルのキーを返したいとします。特定の値が多次元配列のサブレベルに含まれている場合、最上位配列のキーを返します

たとえば、「管理用メール」として「@ google.com」を入力した場合、「Google」を返信します。

私の配列は以下の通りです。

$array = array (
    'Google' => array (
      'Allowed Emails' => array ('@google.com','@gmail.com'), 
      'Admin Emails' => '[email protected], [email protected]', // This really is supposed to be a String, not an array 
      'Company Name' => 'Alphabet', 
      'Memberships' => array ('websites', 'google'), 
), 
    'Facebook' => array (
      'Allowed Emails' => array ('@facebook.com','@facebook.co.uk'), 
      'Admin Emails' => '[email protected], [email protected]', 
      'Company Name' => 'Facebook Limited', 
      'Memberships' => array ('websites', 'facebook'), 
), 
    'Apple' => array (
      'Allowed Emails' => array ('@apple.com','@icloud.com'), 
      'Admin Emails' => '[email protected]', 
      'Company Name' => 'Apple Inc', 
      'Memberships' => array ('computers', 'apple'), 
), 
     'Dell2' => array (
      'Allowed Emails' => array ('@dell.com'), 
      'Admin Emails' => '[email protected]', 
      'Company Name' => 'Dell Computers', 
      'Memberships' => array ('computers', 'dell'), 
) 
); 

私はarray_filterを使用して長い道のりを得ることができたが、私は(「google.com」は、この場合には)設定した変数が配列の最初の変数である場合は、以下にのみ機能します。

大変ありがとうございます。これはハードでコード化されることはありませんよう

function setitem ($item){ return $item['Allowed Emails'][0] === '@google.com' ;} 

$filteredarray = array_filter($array, setitem); 


$toplevelarray = array_keys($filteredarray); 

echo $toplevelarray[0]; 

はまた、私は「SetItem関数」関数に「@ google.com」は、この場合、変数を渡すいくつかの助けを(必要があります。何らかの理由で、私はエラーを取得した場合私が試してみて、それを通常の方法を行う

感謝を事前に特定の

答えて

1

何がそれを行わないために:。。

$result = []; 
foreach ($array as $k => $v) { 
    if (in_array('@google.com', $v['Allowed Emails'])) 
     $result[] = $k; 
} 

print_r($result); 

すでにキーがユニークな使用の代わりに文字列であることがわかっている場合の配列を入力し、breakを使用してループを停止します。

array_filterまたはarray_reduceと同じことができますが、速度は遅くなります。

変数を関数に渡すにはもう一度魔法を使う必要はありません:パラメータを追加します。

+0

これは素晴らしいことです。ありがとうCasimir。 –

+0

私はすべての '許可された電子メール'を1つの新しい配列(本質的に以下のものが印刷されるもの)にマージしたいのですが、これを行う簡単な方法はありますか? '$($ array = $ v){ print_r($ v ['Allowed Eメール']); } ' –

+0

これは私の2番目の質問を解決するように思われる - これはエレガントな解決策ですか?ありがとう '$ result = []; foreach($ array = $ v){ $ result [] = $ v ['Allowed Eメール']; } $ result = array_reduce($ result、 'array_merge'、array()); print_r($ result); ' –

関連する問題