- ベストアンサー
連想配列とforeach
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
$_ = "right.name"; print /.*\.name$/; や、 $_ = "chigau.namae"; print /.*\.name$/; の結果を見てみると分かりますが、この正規表現は、そのままで用いると変数 $_ に代入された値のマッチ結果になります。 foreach (keys %hoge) { # ハッシュのキーを一つずつ $_ に代入 if (/.*\.name$/) { print "$hoge{$_}\n"; } } のように、一旦$_ に代入する形式にすれば、お望みのことは可能だと思います。
その他の回答 (1)
- leaz024
- ベストアンサー率75% (398/526)
ハッシュ(連想配列)のキーに正規表現を書くことはできません。 やるなら、次のようにします。 foreach (keys %hoge) { print $hoge{$_} if /\.name$/; } あるいは、 foreach (grep /\.name$/, keys %hoge) { print "$hoge{$_}\n"; } もしくは、 foreach (map $hoge{$_}, grep /\.name$/, keys %hoge) { print "$_\n"; }
お礼
>ハッシュ(連想配列)のキーに正規表現を書くことはできません。 そうですか。出来ると嬉しいこともあるので是非対応して欲しいところです。その分オーバーヘッドが大きくなってしまっては元も子もないですが。 色々書き方があるものですね。勉強になります。 #といっても後半の2つはほとんど意味不明です^^;)。勉強しておきます。 ありがとうございました。
関連するQ&A
- 連想配列を配列に入れるには
下記のような連想配列を配列に入れる簡単な方法はありますか。 array("a"=>"1","b"=>"2") 期待する結果(print_r) Array ( [0] => Array ( "a" => "1" ) [1] => Array ( "b" => "2" ) ) 宜しくお願い致します。
- ベストアンサー
- PHP
- 連想配列の配列の使い方
C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt"); $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }
- ベストアンサー
- Perl
- 配列や連想配列について
言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。
- ベストアンサー
- Perl
- foreachで多次元配列にしたくないのですが……
foreachで多次元配列にしたくないのですが、多次元配列になってしまいます。 なぜでしょうか? ■$hoge Array ( [0] => 3 [1] => 9 ) ■処理 foreach ($hoge as $val){ $result[]= 関数($val); } ■期待している結果 Array ( [0] => Array ( [id] => 1 [created_at] => 2013-08-01 ) [1] => Array ( [id] => 2 [created_at] => 2013-08-02 ) ) ■実際の結果 Array ( [0] => Array ( [0] => Array ( [id] => 1 [created_at] => 2013-08-01 ) ) [1] => Array ( [0] => Array ( [id] => 2 [created_at] => 2013-08-02 ) ) )
- ベストアンサー
- PHP
- foreachと連想配列変数について
はじめまして。 初めて質問します。 私はあまりプログラム知識がないのですが、PHPに興味があり独学でPHPを勉強しているのですが、よくわからない個所があって困っています。 <?php $list[0]["code"] = "0100:"; $list[0]["name"] = "ミルクパン"; $list[1]["code"] = ""; $list[1]["name"] = "イチゴパン"; $list[2]["code"] = "0301:"; $list[2]["name"] = "メロンパン"; foreach($list as $data) { $product = ""; foreach($data as $value) { if ($value == "") continue 2; $product .= $value; } print $product."\n"; } ?> 実行結果 0100:ミルクパン 0301:メロンパン と本に書いてあるのですが、 0100:ミルクパン 0301:メロンパン と表示されるのがよくわかりません。 $product .= $value; で、なぜ "0100:"と"ミルクパン"が表示されるのでしょう。 普通のforeach($list as $value)ならイメージできるのですが、 二重にforeachがあるので、 ($list as $data) ($data as $value) の意味がよくわからないです。 どなたかご教授していただけませんでしょうか?
- ベストアンサー
- PHP
- 配列の連想配列のソート
お世話になります。mooTaihenです。 Perlで配列のソートが出来なくて困っております。 お忙しいところ、誠に申し訳けありませんが、ご教示をお願い致します。 【内容】 サンプルソースに示した様なデータ構成をソートしたいのですが、思惑通りに行きません。 期待しているソート結果は、 a1 b3 b4 c2 です。 <サンプルソース> my @data; $data[0]{name} = "b"; $data[0]{cnt} = 4; $data[1]{name} = "c"; $data[1]{cnt} = 2; $data[2]{name} = "b"; $data[2]{cnt} = 3; $data[3]{name} = "a"; $data[3]{cnt} = 1; @data2 = sort {chg($a,$b)} @data; foreach (@data2) { print $_->{name} . $_->{cnt} . "\n"; } sub chg { my(@s,@d)=@_; return $s[0]{name} cmp $d[0]{name} and $s[0]{cnt} <=> $d[0]{cnt}; } <出力結果> a1 b3 c2 b4
- ベストアンサー
- Perl
- smartyのforeachの使い方
仮に$strが以下のような配列を持っている場合smartyのtpl側で 出力させたいのですがうまくいきません。 Array ( [0] => Array ( [id] => 1 [name] => 名前 [sub_id] => Array ( [0] => 12 [1] => 13 ) [sub_name] => Array ( [0] => あああ [1] => いいい ) [sub_cnt] => Array ( [0] => 5 [1] => 5 ) ) [1] => Array ( [id] => 1 [name] => 名前 ) ) sub_***は配列が存在するものとしないものがあります。 そしてtpl側は {foreach item=items from=$str} <ul id="side{$items.id}"> {foreach item=item from=$items} <li><a href="index.php?id={$item.sub_id}">{$item.sub_name} ({$item.sub_cnt})</a></li> {/foreach} </ul> {/foreach} とforeachを重ねてみたのですがsub_***の値が表示されない 状態です。 複雑な配列なのですがこの場合どうすればうまく表示させれるの でしょうか?
- ベストアンサー
- PHP
- たくさんの配列を簡単に操作したい。
配列の要素を出力したいのですが、 @name_1 @name_2 @name_3 @name_4 print "@name_1\n@name_2\n@name_3\n@name_4\n"; としてるのですが、配列が100個あったとき書ききれません。 このような処理を簡単に書ける方法はないでしょうか? ニュアンスとしては以下のような感じです。 for($n=0;$n<100;$n++){ print "@name_$n\n"; } ご教授おねがいします。
- ベストアンサー
- Perl
- 連想配列をリターン値として返す方法
ご協力をお願いいたします。 <私の考え>を記載しましたが、上手く動作しませんでした。 何が間違っているのか、ご指摘をお願いいたします。 質問は、2件あります。 (1)連想配列の2次元について 例えば、以下の様なデータを持っている場合、 連想配列では、どの様に定義したらよいですか? <データ> |*name|*tel| |moo |012 | |aiai |235 | <私の考え> %data; $data[0]{"name"} = "moo"; $data[0]{"tel"} = "012"; $data[1]{"aiai"} = "moo"; $data[2]{"235"} = "012"; (2)上記の様なデータをサブルーチンの返り値として渡すには? <私の考え> sub.pl(パッケージ) sub data { %data; $data[0]{"name"} = "moo"; $data[0]{"tel"} = "012"; $data[1]{"aiai"} = "moo"; $data[2]{"235"} = "012"; return(%data); } main.pl(サブルーチンを呼び出しているファイル) %data = data(); print "$data[0]->{name}\n" print "$data[0]->{tel}\n"
- ベストアンサー
- Perl
- 多次元配列で、foreachを使って、key値を
多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。 $x = array(); $x[] = array( "id" => 1, "name" => "JavaScript", ); $x[] = array( "id" => 5, "name" => "PHP", ); $z = array(); foreach($x as $key => $value){ $z[$value["id"]] = $value; } print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、 $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array ( [id] => 1 [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?
- ベストアンサー
- PHP
お礼
回る数を減らそうと画策しましたが、配列の数分だけ回らないとだめと言うことですね。 ありがとうございました。