2013-03-15 68 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; 
}