PHP上級者が集まるスレat PHP
PHP上級者が集まるスレ - 暇つぶし2ch54:nobodyさん
08/10/31 19:40:09 Eo+dqOlV
preg_match_all()で得られる結果の多元配列を、
count()に渡したときのカウント数について教えて頂けないでしょうか。
カウント数がどうにも解せないのです。

↓これを実行すると、なぜか結果として4が表示されてしまいます。
$s = "aaa111aaa222\naaa111aaa222\naaa111aaa222\naaa111aaa222";
preg_match_all('/(.+111)(.+222)/', $s, $match);
echo count($match[0], COUNT_RECURSIVE);

では、preg_match_all()が返す多元配列と同等の多元配列を作って、
それをcount()に渡してみます。

↓この結果は3になる。この結果は正しい。
$match = array(
array(0, 1, 2),
array(0, 1, 2),
array(0, 1, 2),
array(0, 1, 2)
);
echo count($match[0], COUNT_RECURSIVE);

preg_match_all()の返す多元配列は特殊なものなのでしょうか?
(うーん、そんな馬鹿な・・・)


55:nobodyさん
08/10/31 20:45:48
質問スレがあるのにこんなところで聞くというセンスもどうかと思うが、
まずなぜ$match[0]をvar_dumpしてみようと思わないのかな
↓結果
array(4) {
[0]=>
string(12) "aaa111aaa222"
[1]=>
string(12) "aaa111aaa222"
[2]=>
string(12) "aaa111aaa222"
[3]=>
string(12) "aaa111aaa222"
}


56:nobodyさん
08/10/31 23:58:11
レンザバでiconvを使おうとしたらモジュールに組み込まれてなくて
phpからJavaのJNIみたいに直接libiconv.soを呼び出せないかと思ったのですが
出来ますか?


57:nobodyさん
08/11/01 00:08:17
やってみれば

58:nobodyさん
08/11/01 00:20:57
できるならやってみます

59:nobodyさん
08/11/01 00:23:11
どんだけ~

60:nobodyさん
08/11/01 07:37:24 /2wL5ARz
>>55さん
preg_match_all()の結果と同じ配列を作るには

$match[0]=array("全体1","全体2","全体3");
$match[1]=array("部分1","部分2","部分3");
$match[2]=array("部分A","部分B","部分C");

と、しないといけなかったんですね・・・。
ありがとうございます。なぞが解けました。
多元配列を正しく理解していませんでした。

61:nobodyさん
08/11/01 11:28:32
>>60
何を言ってるんだ?
まとめて代入しても同じ

62:60
08/11/01 17:51:55 /2wL5ARz
>>61さん
すいません。どういう意味なのでしょうか?

63:nobodyさん
08/11/01 18:09:48
>>62
61じゃないけど>>60のほうが意味わからない。
何を想定してどんなふうに想定外だったのかということがはっきりしないな。


64:60
08/11/01 18:17:53 /2wL5ARz
>>63さん
要するに、preg_match_all()でマッチしたときに返される多元配列と
同じ形の多元配列を自分で作るにはどうしたらいいのか?
ということがわからなかったです。

65:nobodyさん
08/11/01 18:22:04
$match = array(array(array(...

66:nobodyさん
08/11/01 18:44:31
>>64
array(4) {
[0]=>
string(12) "aaa111aaa222"
[1]=>
string(12) "aaa111aaa222"
[2]=>
string(12) "aaa111aaa222"
[3]=>
string(12) "aaa111aaa222"
}
のcountは4になって当然。
なのに3になると思ってたのはなぜ?
要点だけ言われても余計分からないから全部言ってくれ。
いや解決したんならもういいんだけど、単なる雑談として。

67:60
08/11/01 19:36:22 /2wL5ARz
サンプルコードをもう一度きちんと書きました。

//①///////////////////////
$s = "aaa111aaa222\naaa111aaa222\naaa111aaa222\naaa111aaa222";
preg_match_all('/(.+111)(.+222)/', $s, $match);
echo count($match[0], COUNT_RECURSIVE).'<br>';

//②///////////////////////
$match[0]=array("aaa111aaa222", "aaa111", "aaa222");
$match[1]=array("aaa111aaa222", "aaa111", "aaa222");
$match[2]=array("aaa111aaa222", "aaa111", "aaa222");
$match[3]=array("aaa111aaa222", "aaa111", "aaa222");
echo count($match[0], COUNT_RECURSIVE).'<br>';

//③///////////////////////
$match = array(
array("aaa111aaa222", "aaa111", "aaa222"),
array("aaa111aaa222", "aaa111", "aaa222"),
array("aaa111aaa222", "aaa111", "aaa222"),
array("aaa111aaa222", "aaa111", "aaa222"));
echo count($match[0], COUNT_RECURSIVE).'<br>';


68:60
08/11/01 19:37:04 /2wL5ARz
>>66さん
たびたびすいません。
まだ解決していませんでした。

①は4が出力されます。
②は3が出力されます。
③は3が出力されます。
私は①②③はすべて、3が出力されるのが正しいと思っていました。
なぜなら$match[0]に入っている配列要素は3つなので。

>>65さん
③のケースと同じでしょうか?
これだと①と同じ結果にはなりませんでした。
申し訳ありませんが、もう少し具体的にお願いできないでしょうか?

69:nobodyさん
08/11/01 20:19:34
>>68
いや66で書いたのと同じことを繰り返すことになるけど
①の$match[0]に入っているのは
array(4) {
[0]=>
string(12) "aaa111aaa222"
[1]=>
string(12) "aaa111aaa222"
[2]=>
string(12) "aaa111aaa222"
[3]=>
string(12) "aaa111aaa222"
}
だろ?なんでそれが3になると?
正規表現を誤解しているのか、count関数の挙動を誤解しているのか、さっぱり分からん。

70:nobodyさん
08/11/01 20:23:04
まさか$matchと$match[0]の区別がつかないとか・・・

71:nobodyさん
08/11/03 02:12:33
PHP5.3 (PHP6)の新機能についていけないです
無名関数とかラムダ関数とかクロージャとか静的遅延束縛とか、
理解できないです
そういったキーワードを検索して楽しそうに書いてたり、
愚痴ったりしてるブログを見ると、理解できない自分が寂しいです
情報系の大学に行った方がいいんでしょうか
独学は無理っぽいです

72:nobodyさん
08/11/03 02:23:37
大学はそんなこと学ぶとこじゃないと思うがw

73:nobodyさん
08/11/03 22:29:26
>>71
PHPは手っ取り早くWebアプリを開発するためのツールという側面が強いから、
そこらへんのことを学びたいなら他の言語で勉強した方がいいと思う。
PHPは最初は取っつきやすいけど、プログラミングの本質を学ぼうとするとすぐに壁に突き当たる。
最近の言語ではPythonが学習に向いていると思うけど、なにしろ日本語の情報が少ないしな。

74:nobodyさん
08/11/06 10:30:09
>>42
PHP3は、んなだったね


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch