2013-03-15 71 views
0

我有一個數組,可以有很多層次深例如在PHP中遞歸搜索數組中的鍵匹配或值匹配?

'For Sale' => array(
     'Baby & Kids Stuff' => array(
      'Car Seats & Baby Carriers', 
          ), 
     ), 
'For Rent' => array(
     'Other' => array(
      'Baby Clothes', 
     ), 
     'Prices' => 'hhhhhh', 
        ), 

我所試圖做的是搜索兩個數組鍵和值相匹配的字符串,我想出了這個,但迄今爲止它不工作...

// validate a category 
public function isValid($category, $data = false) { 

    if(!$data) { 
     $data = $this->data; 
    } 
    foreach($data as $var => $val) { 
     if($var === $category) { 
      return true; 
     } elseif(is_array($val)) { 
      $this->isValid($category, $data[$var]); 
     } elseif($val === $category) { 
      return true; 
     } 
    } 
} 

我不知道我在做什麼錯,非常感謝。

+0

你必須返回isValid的遞歸調用,不知道是否足以修復它。 – cernunnos 2013-03-15 15:54:12

回答

1

RecursiveArrayIterator/RecursiveIteratorIterator

$arr = array(
    'For Sale' => array(
     'Baby & Kids Stuff' => array(
      'Car Seats & Baby Carriers', 
     ), 
    ), 
    'For Rent' => array(
     'Other' => array(
      'Baby Clothes', 
     ), 
     'Prices' => 'hhhhhh', 
    ), 
); 

function isValid($category, array $data) 
{ 
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data), RecursiveIteratorIterator::CHILD_FIRST); 

    foreach ($iterator as $key => $value) { 
     if (is_string($key) && ($category == $key)) { 
      return true; 
     } 
     if (is_string($value) && ($category == $value)) { 
      return true; 
     } 
    } 
    return false; 
} 

var_dump(isValid('Baby Clothes', $arr)); 
+0

這真棒,以前從未見過!第一次工作!猜猜我必須重新閱讀PHP手冊以獲得最新的!謝謝。 – ShaShads 2013-03-15 16:20:24

3
} elseif (is_array($val)) { 
    return $this->isValid($category, $val); 
    ^^^^^^ 
} 

您需要return即使從遞歸調用。

0

//如果你使用PHP> = 5.1.0比它更好地使用驗證類別 公共職能的isValid($類,$數據= FALSE){

if(!$data) { 
    $data = $this->data; 
} 
foreach($data as $var => $val) { 
    if($var === $category) { 
     return true; 
    } elseif(is_array($val)) { 
     return $this->isValid($category, $data[$var]); 
    } elseif($val === $category) { 
     return true; 
    } 
} 
return false; 
}