2017-10-26 19 views
3

を強制することの私は、配列の配列を持っているとしましょう:配列のランダムなキーを選択しますが値の1

$A=array(); 
$A['lemonade']=array('a','b','g'); 
$A['tree']=array('a','b','f'); 
$A['willpower']=array('a','b','g'); 

どのように私は、ランダムに$ Aの一つのキーをつかむことが、唯一の「グラムを含むものの'$ A [n] [2]で?

直接アプローチでは、すべてを繰り返しますが、gを含む配列のみを含む新しい配列を作成し、その新しい配列でランダムなキーを取得します。

$bro=array(); 
foreach($A as $k=>$hijito){ 
    if($hijito[2]=='g'){ 
     $bro[$k]=$hijito; 
    } 
} 

$theKeyIWant=array_rand($bro); 

しかし、これに近づくための他のより美しい方法があるのだろうかと思います。

+2

'array_rand(array_filter($ A、機能($ V){リターン 'G' = == $ v [2];})) 'は動作しますが、ループを隠すだけです。 – Yoshi

+0

@ Yoshiありがとうございました。 –

答えて

1

array_walkDEMO)を使用して、このメソッドもあります

$A = array(); 
$A['lemonade'] = array('a','b','g'); 
$A['tree'] = array('a','b','f'); 
$A['willpower'] = array('a','b','g'); 

$bro = $A; 
array_walk($A, function($item, $key) use (&$bro) 
{ 
    if($item[2] != 'g') 
    { 
     unset($bro[$key]); 
    } 
}); 

var_dump($bro); 
1

お試しください。まず、配列をフィルタリングしてランダムキーを取得します。

$A=array(); 
$A['lemonade']=array('a','b','g'); 
$A['tree']=array('a','b','f'); 
$A['willpower']=array('a','b','g'); 

$theKey = array_rand($filteredArr = array_filter($A, function($arr){ 
    return ($arr[2] == 'g'); 
})); 
echo $theKey; 
+0

ありがとう、私は他の答えを受け入れたが、これも役立ちます;) –

1

アレイイテレータで試してみてください。解決策以下の表情を持っている:

$n = 2; //key which need to be checked 
$v = 'g'; //value which need to be checked 
$key_array = array(); 
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($A)); 

foreach ($it as $key => $val) { 
    $pkey = $it->getSubIterator($it->getDepth() - 1)->key(); //get parent key 
    if($key == $n && $val == $v){ 
     $key_array[$pkey] = $A[$pkey]; 
    } 
} 
print_r($key_array); //desired array 
print_r(array_rand($key_array)); //desired key 
+1

Chetanありがとう、私は他の答えを受け入れたが、これも非常に便利です。 –

関連する問題