2012-05-04 21 views
2

この問題の適切なタイトルを付ける方法は完全にはわかりませんが、配列内にネストされた配列をループする必要があります(その配列は他の配列の要素でもあります)。最初は、どの配列がまだループされていないかをタグ付けする必要があると思っていましたが、 "base"配列を完全にループする必要があると思いました(これは必要ではなく、PHPは何とかこれを任意に行います) 。この問題はちょっと変わったようです。値が見つからない場合は条件付きのclausを省略し、その逆の場合は、配列のどこにでもネストされた値を見つけることになります。とにかく、以下のように関数は次のとおりです。PHPループ多次元配列

function loop($arr, $find) { 
    for($i=0;$i<count($arr);$i++) { 
    if($arr[$i] == $find) { 
     print "Found $find"; 
     return true; 
    } else { 
     if(is_array($arr[$i])) { 
     $this->loop($arr[$i], $find); 
     } else { 
     print "Couldn't find $find"; 
     return false; 
     } 
    } 
    } 
} 
+0

「foreach」に疲れましたか? – Tibor

+0

どうしたらいいですか? – shadyyx

+0

@Tibor、 'foreach'を使うと、小さな配列とは関係ない' for'を使うよりも速度が遅くなりますが、多レベル配列(とくに大きな)では速度差が速くなります... – shadyyx

答えて

1

おそらく、あなたのような何かにあなたのコードを変更する必要があります。

var $found = false; 
function loop($arr, $find) { 
    foreach($arr as $k=>$v){ 
    if($find==$v){ 
     $this->found = true; 
    }elseif(is_array($v)){ 
     $this->loop($v, $find); 
    } 
    } 
    return $this->found; 
} 
0

これは、しばらくの間、私のために働いてきました。

function array_search_key($needle_key, $array) { 
    foreach($array AS $key=>$value){ 
    if($key == $needle_key) return $value; 
    if(is_array($value)){ 
     if(($result = array_search_key($needle_key,$value)) !== false) 
     return $result; 
    } 
    } 
    return false; 
} 
0

OK、どのような若干の変更について:

function loop($arr, $find) { 
    for($i=0;$i<count($arr);$i++) { 
     if(is_array($arr[$i])) { 
      $this->loop($arr[$i], $find); 
     } else { 
      if($arr[$i] == $find) { 
       print "Found $find"; 
       return true; 
      } 
     } 
    } 
    return false; 
} 

うーん?