2017-02-25 12 views
0

に動作していない私は、このマッチ配列のキーは、PHP

Array (
    [test.0.male_min_months] => Array (
     [0] => The test.0.male_min_months field has a duplicate value. 
    ) 
    [test.42.male_min_months] => Array (
     [0] => The test.42.male_min_months field has a duplicate value. 
    ) 
    [name] => Array (
     [0] => The name field is required. 
    ) 
    [unit_id] => Array (
     [0] => The unit id field is required. 
    ) 
) 

のような配列を持っており、配列内のキーをチェックする機能がpreg_array_key_exists('/(test.0.male)/',$my_array);

のために働いて

function preg_array_key_exists($pattern, $array) { 
    $keys = array_keys($array); 
    return $array[preg_grep($pattern,$keys)[0]]; 
} 

そのですが、役に立たなかった理由はどこですか?preg_array_key_exists('/(test.42.male)/',$my_array);

+0

がdownvoteが、説明してくださいお気軽に。 –

+0

あなたは見たことがありますか:http://php.net/manual/en/function.preg-grep.php#111673? – Rizier123

答えて

0

解決策を提供する。

カスタム関数内でarray_keys()を呼び出すと、各キーはインデックス付き(自動インクリメント)キーの値になります。

preg_grep($pattern,$keys)を呼び出すと、一致する配列が作成され、数値キーが保持されます。具体的には、"test.42.male_min_months"のキーは1です。

つまり、return $array[preg_grep($pattern,$keys)[0]]は、パターンが最初のサブアレイのキーを$my_arrayに要求した場合にのみ成功します。

、使用を既存の機能を修正するには:

current(preg_grep($pattern,$keys)); 

これはあなたのキーパターンに一致するサブ配列の最初の値を返します。

コード(Demoでvar_exportの問題を説明するための):

<?php 
$my_array=array(
    "test.0.male_min_months"=>array(
     0=>"The test.0.male_min_months field has a duplicate value." 
    ), 
    "test.42.male_min_months"=>array(
     0=>"The test.42.male_min_months field has a duplicate value.", 
    ), 
    "name"=>array(
     0=>"The name field is d." 
    ), 
    "unit_id"=>array(
     0=>"The unit id field is d." 
    ) 
); 

function preg_array_key_exists($pattern,$array){ 
    $keys = array_keys($array); // create new indexed array holding each key as a value 
    return $array[current(preg_grep($pattern,$keys))]; 
} 

$pattern="/(test.42.male)/"; // your regex pattern (which doesn't fail you) 
// $pattern="/(test\.42\.male)/"; // escape the literal dots, as a matter of good practice  
$output=preg_array_key_exists($pattern,$my_array); 

P.S.あなたの正規表現リテラルのドットを使用している場合、この\.

出力されているように良い習慣の問題として、それらをエスケープ:

array (
    0 => 'The test.42.male_min_months field has a duplicate value.', 
) 
+0

@ detective404私の答えがあなたの問題を十分に解決するならば、あなたの質問が未回答の質問リストから削除されるように緑のチェックを与えてください。そして将来の読者は解決された質問を解決する時間を無駄にしません。まだ何かが正しくない場合は、私に知らせてください。 – mickmackusa