2016-11-09 7 views
2

私は脳の痛みが多いので、助言してください。私は次の多次元配列持ちPHP - 多次元配列の検索

  • :私は次のような状況を持っている - 検索

    $numbers = array (
        "one_digit" => array (1,2,3,4,5), 
        "two_digits" => array (20,21,22,23,24,25), 
        "three_digits" => array (301,302,303,304,304), 
        "mixed_digits" => array (9,29,309,1) 
    ); 
    
  • を私は次のために$数字配列に検索する方法が必要です番号20が任意の$ numbers配列にあり、見つかったところでエコーする場合 ex。 $ find1 = m_array_search( "20"、$ numbers); echo "検索した値が" $ find1。 "の部分配列$ numbers"で見つかりました。 結果: "2桁の数字の部分配列で検​​索された値が見つかりました"

    - 数字1が任意の$数値配列に含まれていれば、それを検索して ex。 $ find2 = m_array_search( "1"、$ numbers); echo "検索した値が" $ find2。 "の部分配列$ numbers"で見つかりました。 結果:

は、このように機能が1つまたは多くの「サブアレイ」の存在を見つけることができなければならない「私は、検索two_digitsの値、$のmixed_digits部分配列番号を見つけました」。申し訳ありませんが、私は "サブアレイ"という用語を逃した場合

ありがとうございます!

答えて

0

あなたがループ内でarray_search()でこれを試すことができます -

$numbers = array (
    "one_digit" => array (1,2,3,4,5), 
    "two_digits" => array (20,21,22,23,24,25), 
    "three_digits" => array (301,302,303,304,304), 
    "mixed_digits" => array (9,29,309,1) 
); 

function search_value($array, $value) 
{ 
    $result = array(); 
    foreach($array as $key => $sub) { 
    // check if element present in sub array 
    if(array_search($value, $sub) !== false) { 
     // store the key 
     $result[] = $key; 
    } 
    } 
    return $result; 
} 

var_dump(search_value($numbers, 1)); 
var_dump(search_value($numbers, 5)); 

出力

array(2) { 
    [0]=> 
    string(9) "one_digit" 
    [1]=> 
    string(12) "mixed_digits" 
} 
array(1) { 
    [0]=> 
    string(9) "one_digit" 
} 
1

これをチェックして、あなたに役立つかどうか教えてください。

<?php 
function array_find_deep($array, $search, $keys = array()) 
{ 
    foreach($array as $key => $value) { 
     if (is_array($value)) { 
      $sub = array_find_deep($value, $search, array_merge($keys, array($key))); 
      if (count($sub)) { 
       return $sub; 
      } 
     } elseif ($value === $search) { 
      return array_merge($keys, array($key)); 
     } 
    } 

    return array(); 
} 


$numbers = array (
    "one_digit" => array (1,2,3,4,5), 
    "two_digits" => array (20,21,22,23,24,25), 
    "three_digits" => array (301,302,303,304,304), 
    "mixed_digits" => array (9,29,309,1) 
); 

var_dump(array_find_deep($numbers, 20)); 

var_dump(array_find_deep($numbers, 1)); 

var_dump(array_find_deep($numbers, 301)); 

var_dump(array_find_deep($numbers, 309)); 

?> 

あなたは$result = array_find_deep($numbers, 20);のような変数に結果を格納した配列に、それは価値を発見したという結果が得られますecho $result[0]を試すことができます。

2

in_array機能を使用して簡単な解決策:

$search = 1; 
$keys = []; 
foreach ($numbers as $k => $v) { 
    if (is_array($v) && in_array($search, $v)) $keys[] = $k; 
} 

echo "I've found the searched value in ". implode(', ', $keys) ." subarray". ((count($keys) > 1)? "s":"") ." of \$numbers"; 

出力:

I've found the searched value in one_digit, mixed_digits subarrays of $numbers 
+0

@ BogdanWebbこれはページ上での最良の答えです( 'is_array()'チェックを省略することができます)。私は...するだろう)。 'array_search()'は、各サブアレイのチェックから真偽結果だけを必要とするときには過剰です。あなたは再考したいかもしれません。 – mickmackusa