2010-11-04 153 views
0

最近我遇到了一個問題,這讓我發瘋。我有這樣一個多維數組:在多維數組(PHP)中搜索

$a = array(
'db' => array(
    '0' => array(
     'id' => '1', 
     'name' => 'test', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ), 
    '1' => array(
     'id' => '2', 
     'name' => 'test2', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ) 
    '2' => array(
     'id' => '3', 
     'name' => 'test', 
     'cat' => array(
      'a' => '50', 
      'b' => '40', 
      'c' => '90' 
     ), 
     'canvas' => '1' 
    ) 
) 
); 

而我想用它來搜索它:search('canvas = 1');

,將返回所有的陣列,DB的孩子,有值1。或者,例如一鍵帆布:

搜索(「A = 15」);

都將返回一個有鑰匙,貓的孩子所有的數組,命名爲並與15

+0

你想在這種情況下完成什麼?我有一種感覺,可能會有更優雅的解決方案,但這取決於您要解決的問題。 – 2010-11-04 13:23:02

回答

3
$a = array(
'db' => array(
    '0' => array(
     'id' => '1', 
     'name' => 'test', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ), 
    '1' => array(
     'id' => '2', 
     'name' => 'test2', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ), 
) 
); 

//checks if array $array contains element with $searchKey key, and $searchVal value 
function arrayContains($array, $searchVal, $searchKey) { 
     if (!is_array($array)) 
      return false; 
     foreach ($array as $key => $value) { 
      if ($key === $searchKey && $searchVal === $value) 
       return true; 
      if (is_array($value) && arrayContains($value, $searchVal, $searchKey)) 
       return true; 
     } 
     return false; 
    } 

function search($a, $search) { 
    list($searchKey, $searchVal) = explode('=', $search); 
    $result = array(); 
    foreach($a as $val) { 
     if (arrayContains($val, $searchVal, $searchKey)) 
      $result[] = $val; 
    } 
    return $result; 
} 

print_r(search($a['db'], "a=15")); 
print_r(search($a['db'], "canvas=1")); 

其中產生這樣的輸出值(輸出變量$ a [」子陣列DB']包含搜索鍵=>值對):

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => test 
      [cat] => Array 
       (
        [a] => 15 
        [b] => 20 
        [c] => 30 
       ) 

      [canvas] => 2 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [name] => test2 
      [cat] => Array 
       (
        [a] => 15 
        [b] => 20 
        [c] => 30 
       ) 

      [canvas] => 2 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [id] => 3 
      [name] => test 
      [cat] => Array 
       (
        [a] => 50 
        [b] => 40 
        [c] => 90 
       ) 

      [canvas] => 1 
     ) 

) 
+0

非常感謝。 :) – JimmyNeutron 2010-11-04 13:52:19

0
function search($array, $canvas) 
{ 
    $result = array(); 
    foreach ($array as $k1 => $v1) { 
     foreach ($v1 as $k2 => $v2) { 
      if ($v2['canvas'] == $canvas) { 
       $result[] = $array[$k1][$k2]; 
      } 
     } 
    } 
    return $result; 
} 

// $a = your array 
print_r(search($a, 1)); 
+0

您的功能似乎是特定於畫布情況。如果我想找到一個= 50呢? – JimmyNeutron 2010-11-04 13:46:21

+0

對不起。我不仔細閱讀問題。但是,好的回答使@Denis。 – pltvs 2010-11-04 13:55:22