phpでのループ処理
ゲスト
ゲスト (ななし)...
ATOMRSS
  • コード求むID: 315
  • 登録日時:  2008/08/10 20:55
  • 最終更新日時: 2008/09/14 22:25
  • アクセス数: 777
  • タグ:  php ループ foreach
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

phpでのループ処理についてアドバイスをお願いします。

    $array["apple"]
    $array["mikan"]
    $array["budou"]

    foreach($array as $key => $value){
        ※ループ処理
    }

でインデックスが何個有ってもループ処理できますが

    $array["apple"][0]
    $array["apple"][1]
    $array["apple"][2]

のように多次元配列になった場合はどのように処理するのがスマートでしょうか。

$i 0;
while(){
    if(!strlen($array["apple"][$i])){
        exit;
    }
    ※ループ処理
    $i++;
}

上記はぱっと思いついたコードでまだ試していません。
スマートになるコードをアドバイスお願いします。

コメント

  • ゲスト
  • 1:ゲスト (暇人)
  • 2008/08/11 01:02

$array["apple"] = "りんご";
$array["mikan"] = "みかん";
$array["budou"] = "ぶどう";

foreach($array as $key => $value){ 
    print "$key:$value\n";
} 
#
$array["apple"] = array(0 => "りんご", 1 => "リンゴ", 2 => "林檎");
$array["mikan"] = array(0 => "みかん", 1 => "ミカン", 2 => "蜜柑");
$array["budou"] = array(0 => "ぶどう", 1 => "ブドウ", 3 => "葡萄");

foreach($array as $key => $va){ 
    print "$key:\n";
    foreach($va as $i => $value){
    	print "\t$value\n";
    }
} 

GJGJ

  • ゲスト
  • 2:ゲスト (暇人)
  • 2008/08/11 01:03

$array["apple"] = "りんご";
$array["mikan"] = "みかん";
$array["budou"] = "ぶどう";

foreach($array as $key => $value){ 
    print "$key:$value\n";
} 
#
$array["apple"] = array(0 => "りんご", 1 => "リンゴ", 2 => "林檎");
$array["mikan"] = array(0 => "みかん", 1 => "ミカン", 2 => "蜜柑");
$array["budou"] = array(0 => "ぶどう", 1 => "ブドウ", 3 => "葡萄");

foreach($array as $key => $va){ 
    print "$key:\n";
    foreach($va as $i => $value){
    	print "\t$value\n";
    }
} 

GJ

  • ゲスト
  • 3:ゲスト (暇人)
  • 2008/08/11 01:06

すみません、かぶってしまいました
<(_ _)>

  • GoodJob
  • 0

  • ゲスト
  • 4:ゲスト (かねやん)
  • 2008/08/14 23:30

私がよく使う例です。あまりうまくないですが、どうでしょうか?
要素がない場合、もうちょっと工夫が必要ですが・・・。

$array["apple"][0] = "りんご0"; 
$array["apple"][1] = "りんご1"; 
$array["apple"][2] = "りんご2";

$array["mikan"][0] = "みかん0"; 

for($i=0;$i<count($array);$i++){
   $key = key($array);
   for($j=0;$j<count($array);$j++){
      $Value = key($array[$key]);
      print $key." ".$Value."\n"; 
      next($array[$key]);
   }
   next($array);
}

GJGJ

  • ゲスト
  • 5:ゲスト (ぱ)
  • 2008/09/10 15:52

「多次元」ということなので、何次元でも処理できるように再帰を使って。

$array = "リンゴ";
arrayprint($array);

unset($array);
$array["apple"] = "りんご";
$array["mikan"] = "みかん";
$array["budou"] = "ぶどう";
arrayprint($array);

unset($array);
$array["apple"] = array(0 => "りんご", 1 => "リンゴ", 2 => "林檎");
$array["mikan"] = array(0 => "みかん", 1 => "ミカン", 2 => "蜜柑");
$array["budou"] = array(0 => "ぶどう", 1 => "ブドウ", 3 => "葡萄");
arrayprint($array);

unset($array);
$array["apple"] = array(0 => "りんご", 1 => array(0 => "リンゴ", 1 => "リンゴ"), 2 => array(0 => "林檎"));
$array["mikan"] = array(0 => "みかん", 1 => "ミカン", 2 => "蜜柑");
$array["budou"] = "葡萄";
arrayprint($array);

function arrayprint($array, $count=0){
	if(!is_array($array)){
		print $array."\n";
		return false;
	}
	foreach($array as $key => $val){
		print str_repeat("\t", $count).$key.":";
		if(is_array($val)){
			print "\n";
			arrayprint($val, $count + 1);
		}else{
			print $val."\n";
		}
	}
}

  • GoodJob
  • 0

いろいろ調べながらやってみましたが、
PHPのmap(やwalk)ぜんぜんうまく使えない・・・

$array["apple"][0][4] = "りんご0"; 
$array["apple"][1] = "りんご1"; 
$array["orange"][0] = "みかん0";

function array_print(&$ar, $key="", $str=""){
  is_array($ar) ? 
    array_walk($ar, 'array_print', "$str $key") :
    print"$str $key $ar\n";
}

array_print($array);

出力はこうですが、

  apple りんご0
  apple りんご1
  orange みかん0

うまく動いてるように見せかけてるだけです!!

  • GoodJob
  • 0

array_mapでも。簡単な処理になら使えるかな。

$array["apple"][0]["a"][4] = "りんご0"; 
$array["apple"][1] = "りんご1"; 
$array["orange"][0] = "みかん0";
$array["orange"]["b"]["c"] = "みかん1";

function array_print($ar){
  is_array($ar) ? 
    array_map("array_print", $ar) :
    print"$ar\n"; ## 処理
}

array_print($array);
でも引数の自由度がなさすぎだし、普通に書いたほうが確実にわかりやすいし使いやすいですね、すみません。ちょっと使ってみたかっただけです。
function array_print($ar, $str="array"){
  if(!is_array($ar)){
    print "$str : $ar\n";
    return;
  }

  foreach($ar as $key => $val){
    array_print($val, "$str : $key");
  }
}

array_print($array);

  • GoodJob
  • 0

PHP勉強中のためいろいろへんなの試しで載せちゃいましたがもうちょっとマジメに、再帰使わない実用的な実装についての考察を。

よくありそうな同じ深さの多次元配列を考えます。

$arr1["apple"][0]["a"] = "りんごa"; 
$arr1["apple"][0]["b"] = "りんごb"; 
$arr1["orange"]["c"][0] = "みかん0";
最後の値のみ、もしくは最後のキーと値のみでよい場合はarray_walk_recursiveを使うのが簡単そうです。
(PHP5から使用可能)
function print_vals($a,$k){print("$k:$a\n");}
array_walk_recursive($arr1, 'print_vals');
もしくはこう。
array_walk_recursive($arr1, create_function('$a,$k', 'print "$k:$a\n";'));
出力はこうなります。

a:りんごa
b:りんごb
0:みかん0

ただトップ配列の要素から辿るためのキーのリストが必要な場合は普通に多重ループ回すしかないでしょうか。
こういう出力が欲しいとします。

apple:0:a:りんごa
apple:0:b:りんごb
orange:c:0:みかん0

単純に書くとこんな感じかと。

foreach($arr1 as $key1 => $arr2){
  foreach($arr2 as $key2 => $arr3){
    foreach($arr3 as $key3 => $val){
	  print("$key1:$key2:$key3:$val\n");
	}
  }
}
ただキーのリストは必要でも中途半端な階層の配列(arr2,arr3)は普通必要ないと思うのでできれば宣言したくないところ。
そうすると、こうとか、
while(list($key1) = each($arr1)){
  while(list($key2) = each($arr1[$key1])){
    while(list($key3,$val) = each($arr1[$key1][$key2])){
	  print("$key1:$key2:$key3:$val\n");
	}
  }
}
こうとか、
foreach(array_keys($arr1) as $key1){
  foreach(array_keys($arr1[$key1]) as $key2){
    foreach($arr1[$key1][$key2] as $key3 => $val){
	  print("$key1:$key2:$key3:$val\n");
	}
  }
}
が考えられるでしょうか。ただこれなら$arr2、$arr3使った最初のやつのほうがわかりやすいですね・・・

もっとシンプルな方法を知ってるかたいませんか?

  • GoodJob
  • 0

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

関連ソースコード・ノウハウを登録

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント