トップページ⇒php
1001コメント296KB

【PHP】下らねぇ質問はID出して書き込みやがれ 106

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/04/29(金) 17:11:00.40ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 105
http://hibari.2ch.net/test/read.cgi/php/1300302034/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0383nobodyさん2011/05/16(月) 11:12:27.58ID:???
ログイン継続ってブラウザを2週間ひらきっぱなしにして試したわけ?
03843682011/05/16(月) 11:25:18.37ID:0KSOaR/a
>>383
2週間どころか、1日もたないんですよ。
@ini_set('session.gc_maxlifetime','10368000');
@ini_set('session.gc_divisor','1000');
@ini_set('session.cookie_lifetime','10368000');
@session_start();
超伸ばしてみたりしてますw

ブラウザひらきっぱなしでスリープ状態から復帰すると、ログアウトしてるのが現状です。
0385nobodyさん2011/05/16(月) 11:46:52.01ID:???
session.gc_probabilityとsession.gc_divisorを1にして
切れた頃に他ブラウザからアクセスして
サーバ側のセッションファイルが削除されてないようなら
ブラウザ側で切っちゃってるのかもね
0386nobodyさん2011/05/16(月) 16:14:56.62ID:???
>>384
複数のブラウザや複数のPCでも同じ現象になるのならコードに問題がある
03873682011/05/16(月) 16:26:42.69ID:0KSOaR/a
>>385
あとで試してみます。結果報告しますね。
>>386
コード内で$_SESSIONは特にいじってないんですけどね^^;
上記sessionは、共通でincludeしてあるファイルの一番先頭に書いてます。
0388nobodyさん2011/05/16(月) 16:29:24.37ID:???
$_SESSIONはこの際関係ないだろ
03893682011/05/16(月) 16:32:32.57ID:0KSOaR/a
>>388
コード内でsessionに関係するのは、$_SESSIONだけかなと思ったんですが、
それ以外でsessionに影響することってあるんでしょうか?
0390nobodyさん2011/05/16(月) 16:33:39.26ID:???
当たり前のことだけど、再現する最小限のコードを作ろう。
それから、それを貼ろう。
0391nobodyさん2011/05/16(月) 16:39:44.84ID:???
こんなPHPスクリプト探してます、はここで良い?
0392nobodyさん2011/05/16(月) 16:45:19.62ID:???
>>384
スリープする時に通信が切断されているんじゃないの
0393nobodyさん2011/05/16(月) 16:49:10.51ID:???
>>392
通信が切断されてセッションがクリアされんのかよw
httpはリクエストの都度通信切断してるだろうが
0394nobodyさん2011/05/16(月) 17:05:27.61ID:???
ブラウザを再起動してもセッションを回復出来るんだっけ
0395nobodyさん2011/05/16(月) 17:06:57.90ID:???
>>394
ブラウザの設定によるよ
03963682011/05/16(月) 18:09:44.51ID:0KSOaR/a
>>390
sessionに関する最小限のコードは >>384 だけです。全ページ共通です。
ログインしたときは、$_SESSION['hoge']にユーザーIDを入れます。
ページ表示時に$_SESSION['hoge']の値でログイン判断してます。
とりあえず、説明だけでも。
0397nobodyさん2011/05/16(月) 18:42:04.62ID:???
>>396
その後半がないから最小限のコードになってないってことじゃね。
再現する最小限のコードを作ってみなよ。その過程で穴が見つかることってよくあるよ
0398nobodyさん2011/05/16(月) 19:16:20.58ID:???
>>396
サーバー側でいくらセッションを維持しようと、ブラウザがセッションIDをクリアしてしまえばどうしようもない
どのタイミング(ブラウザを閉じる、スリープになるetc)でIDをクリアするかはブラウザによって動作が微妙に違う

ログイン状態を長期間維持する仕組みは、例えばこうして実現する

1)ログイン時にチケット(uniqidとか色々組み合わせた予測されづらい数字)を発行する
2)サーバー側のDBでユーザーIDとチケットおよびログイン時間を関連付ける
3)チケットをクッキーで食わせる
4)次回ログインページを開いた際、クッキーにチケットがあればログイン時間と見比べてログイン認証を通過
 ※当然同じチケットを使い続けるのは危険なため、このとき再発行してクッキーを上書きする
03993682011/05/16(月) 20:17:12.44ID:0KSOaR/a
>>398
ありがとうございます。
セッションでやらずにクッキーとDB(or ファイル)でログイン状態を維持するように判断させたほうがいいってことですね。
セッションではログインの維持は出来ないって考えてもよろしいんでしょうか?
0400nobodyさん2011/05/16(月) 20:32:18.26ID:???
ログインの維持なんてセッション管理の目的と逆行するようなことやろうとしてるからな
出来ないというよりやるべきでないといったほうが正解か
0401nobodyさん2011/05/16(月) 21:11:28.46ID:???
いやもうアホは回答すんなってw
0402nobodyさん2011/05/16(月) 21:36:36.21ID:???
半分ニートのような生活をしつつweb制作に興味を持ち、HTML+CSS+XHTMLを学び、これじゃスタートラインにも立ってないなと分かりつつも面接に行きました

勿論採用されるはずもなく(というか採用されれば超ラッキーくらいで、なにか話を訊ければ良いくらいのつもりでした)、話を聞くに、PHPを覚えれば実務経験がなくても突破口にはなると言われました
そこでPHPを勉強しようと思い、参考書、入門書を買おうと思うんですが、何かお勧めの本はありますか?自分のレベルは上記の通り何も知らないです

amazonでは「よくわかるPHPの教科書」がやたら評判が良いのでそちらを検討しているんですが、他に良書があれば是非教えてください
よろしくお願いします
0403nobodyさん2011/05/16(月) 21:57:46.33ID:???
突破口にはならんだろ・・・
どんだけ多いと思ってるんだPHP技術者()笑が
0404nobodyさん2011/05/16(月) 22:00:31.66ID:???
勉強の仕方も自分で決められない奴には無理
0405nobodyさん2011/05/16(月) 22:19:13.42ID:9d+tcru/
PHPでもPerlでもAndroidでもiPhoneでもなんでもいいからひとつでも動かせる程度できれば後はどうにかなる
だがこんなとこで聞いてるようじゃな…
0406nobodyさん2011/05/16(月) 23:22:02.14ID:???
ニートで暮らせるなんて裕福だなおい
0407nobodyさん2011/05/16(月) 23:30:22.48ID:???
複数できても地方じゃ実務経験ない時点で確実に無理だけどな(´・ω・`)
0408nobodyさん2011/05/16(月) 23:36:18.77ID:???
一応東京住みです。何の目標、目的意識もなく働いているだけなので半分ニートみたいなもんかなと思っています
こんな下らない質問なのでこのスレなら平気かなと思い質問しましたが、スレ違いだったようなので失礼します
0409nobodyさん2011/05/16(月) 23:39:00.78ID:???
>>402
どんなのでもいいから、Webサイト作って公開して、それ見てもらうのがいいかも。
Windows、Linuxの両方で構築していればなおよし。
ふーん、で終わるかもしれないけど、やってみないことにはわからん。
0410nobodyさん2011/05/16(月) 23:53:51.23ID:???
PHPメインのとこは弱小が多いから教育してやる余裕はない
25になってないなら未経験OKのところに突撃すればいい
JavaとかC#でやってるとこ
そのうちWebの案件もくるだろう
と楽観視できたのが3年ほど前までの話
ここ2・3年は新卒採用さえできない企業が多くなってきてる
PHPの本を探してるなら>>1読めばいいよ
0411nobodyさん2011/05/17(火) 00:29:04.44ID:???
俺はベンチャーに行って「今なんにも出来ないけど勉強します」っていったら採用された
勉強できるとこ証明すればおk
0412nobodyさん2011/05/17(火) 00:45:25.39ID:???
>>399
>>398が言ってる事は解決にならん
あんたのやるべき事は問題の切り分けから

<?php session_start(); echo session_id(), ' : ', @++$_SESSION['a'];
これを再現する状態でリロードして…
- IDだけ変わる : ブラウザがCookieを送っていない → HTTPレスポンスのSet-Cookieを確認
- IDもカウントも変わらない : セッションデータが破棄されてる → http://www.php.net/manual/ja/session.configuration.php
- カウントだけ変わる : 問題なし → やったねたえちゃん
04133682011/05/17(火) 01:24:57.53ID:uHRzMhgS
>>412
やったねたえちゃんでしたw
セッションデータもCookieも大丈夫みたいですね。^^;
0414nobodyさん2011/05/17(火) 01:50:08.87ID:p7ZABAr6
PHPに限らない質問かもしれないけど
DBのトランザクション処理って複数の更新処理がある場合のみにやればいいですか?
それとも更新処理が一つでもあればやるものですか?
04153902011/05/17(火) 01:58:30.02ID:???
>>413
だから言ったのに

>>414
複数の時だけでいいよ。DBアクセスクラスで勝手にトランザクションはるかもしれないけど
0416nobodyさん2011/05/17(火) 02:07:09.06ID:???
DBによる
0417nobodyさん2011/05/17(火) 08:40:42.15ID:???
>>414
データベース板に質問スレがあるからそっちで教えてもらう方がいい

これだけじゃあれなんで、更新以外でも必要になる場合がある
検索結果リストのページングに必要な件数とデータを2回のクエリに分けて取得する場面で
それぞれの取得の合間に他のプロセスがデータを更新・削除すると
データと件数が一致しなくなる
またある一つの条件を基に二つのテーブルからデータを削除する場面で
一方の削除は完了しもう一方のはエラーが発生して中断された場合にも不整合が起き得る
04183982011/05/17(火) 10:36:33.53ID:???
>>399
セッションIDのクリアタイミングがブラウザ依存である以上、セッションのみで実現するのは不可能と考えていいよ
0419nobodyさん2011/05/17(火) 11:13:48.31ID:???
ブラウザのみに依存するわけでもないけどな
04203682011/05/17(火) 11:20:39.08ID:KShR6cC9
>>418
ブラウザのセッションに対する有効期限は、セッションのクッキーで判断してるんですよね。
ってことは、クッキーのみで実装しようが一緒ってことですか?
0421nobodyさん2011/05/17(火) 11:26:09.78ID:???
セッションはデフォルトでCookieを前提にしてるんだから
>>398の俺俺セッションも無意味だしな
常識的に考えりゃセッションが意図した通りの寿命を持たない原因を突き止めるのが先だろ
0422nobodyさん2011/05/17(火) 11:30:11.97ID:???
>>398の期待する動作は自動ログインに近いものじゃない?
セッションは求める動作とはほど遠いと思うんだけど。
0423nobodyさん2011/05/17(火) 12:07:24.35ID:???
>>421
お前は>>373を読んでないだろ?

>>422
うん、>>368は自動ログインを求めているからセッションでは実現不可能
0424nobodyさん2011/05/17(火) 12:17:11.52ID:???
全くもって実現可能なんだが、なぜこんなに話が噛み合わないのか
04254212011/05/17(火) 12:18:03.71ID:???
>>423
> ブラウザを閉じた後や一定時間が経った後でも
これか、見落としてた悪い

でPHPのセッションもお前も同じCookieを使っているんだが
なんで結果が変わると思う訳?
04263682011/05/17(火) 12:21:23.06ID:KShR6cC9
>>424
そうなんですよ。いろんなサイトを見ても、バラバラなんで^^;
自分もよくわからなくなってきたんで、ココで質問してみました。
0427nobodyさん2011/05/17(火) 12:46:28.28ID:???
>>424
ブラウザを閉じたらセッションIDをクリアするのが一般的なブラウザの動作
話がかみ合わないのは「ブラウザを閉じてもセッションを継続」の部分を見逃してるからじゃないの

一部のブラウザではウィンドウをすべて閉じてもセッションIDを維持するようなオプションだか
プラグインがあるけど、それは例外でしょ
0428nobodyさん2011/05/17(火) 12:58:04.45ID:3Z0Fp5Ls
すみません、初心者の質問です。
http://fw.mk-style.com/main.php#/top/
↑はゲームのサイトで、ページを切り替えると、URLは「main.php」以降だけが変わるんですけども。
これの意味が良く分かりません・・。
04293682011/05/17(火) 13:07:18.80ID:KShR6cC9
>>427
オプションやプラグインとか関係なしに、
@ini_set('session.gc_maxlifetime','10368000');
@ini_set('session.gc_divisor','1000');
@ini_set('session.cookie_lifetime','10368000');
@session_start();
の設定で、ブラウザ閉じて、開いても、セッションは維持されています。
ただ、なんらかのタイミングでセッションが破棄されてしまうのも現状です。
その原因がよくわからないんですよね。

すいません。なんか話のポイントわかりづらいですよね。
・ログインの継続がしたい(ブラウザ再起動後も)
・上記設定でブラウザを再起動しても、ログインは維持される
・なんらかのタイミングでログインが維持されない(1日もたないことが多い)
・コード内でログアウト時以外、セッションをいじっていない

上記sessionの設定で、セッションが破棄される(ログアウトする)タイミングは、どんなケースが考えられるのでしょうか?
その部分が分かれば、セッションでも対応できるのかなと。
0430。 ◆oDupeixhZv52 2011/05/17(火) 13:30:21.60ID:???
セッションと、セッションIDとクッキーがめちゃくちゃになってるな。
セッション事体破棄できるのはサーバーだけだから、消されてるだけ。PHPじゃない話。
たとえば、セッションIDをgetにつっこむクッキーレスにすれば、ブラウザの問題は分離できるよ。
0431nobodyさん2011/05/17(火) 13:35:53.01ID:???
>>427
もういい。この件については一切レスしなくていい。
0432nobodyさん2011/05/17(火) 13:59:55.43ID:???
>>430
そのやり方だとセッションハイジャックのリスクがあるんじゃない?
有効期限の長いセッションでURLに埋め込むのはお勧めできない
ジャックされてもいいようなどうでもいいページなら別だけど。
0433。 ◆oDupeixhZv52 2011/05/17(火) 14:01:35.20ID:???
>>432
そらそうだろよw
0434nobodyさん2011/05/17(火) 14:06:48.75ID:???
>>433
ならハイジャックにも触れてあげなよ
0435nobodyさん2011/05/17(火) 14:14:24.62ID:???
どう見てもそれ以前のトラブルシュート段階だろ
だいたいブラウザ閉じてもセッション維持したいって言ってるのに
毎回ブックマークでもさせるのか?

つーかサーバ側のセッションデータとブラウザ側のクッキーぐらい覗けるようにしとけよ
どんだけこのネタ引っ張るつもりだ
0436。 ◆oDupeixhZv52 2011/05/17(火) 14:15:02.32ID:???
>>434
ブラウザのことについては、俺もいらんこと書いたな。どっちかというと質問者じゃなくて、
分かってない人向けのいらん一言だったわ。
聞かれてないこと書くのは要らぬお世話になって良くないのが分かったよ。ありがとう。
0437nobodyさん2011/05/17(火) 14:19:13.78ID:???
>>429
もう一度言うよ。
再現させられるコードを作成して、それを貼って、何が問題なのかを伝えてください。
0438nobodyさん2011/05/17(火) 15:07:06.72ID:???
>>429
共有サーバーで session.save_path が共有されている場合は
他人のスクリプトによって消されている可能性がある
あとは他の人が言うようにセッションIDやCookieヘッダのログを取って
ログアウト状態になった時に確認したりね

session_start();
$log = implode("\t", array(gmdate(DATE_W3C), session_id(), @$_SERVER['HTTP_COOKIE'], var_export($_SESSION, true))) . PHP_EOL;
file_put_contents('ここにログファイル名', $log, FILE_APPEND | LOCK_EX);
04393682011/05/17(火) 15:42:33.78ID:qipHoIvY
>>437
再現されるコードを書くとしたら、、、
■ログイン時
<?php
@ini_set('session.gc_maxlifetime','10368000');
@ini_set('session.gc_divisor','1000');
@ini_set('session.cookie_lifetime','10368000');
@session_start();
@session_regenerate_id();
@session_register('ID');
$_SESSION['ID'] = "id";
echo "login ok";
?>
■ページ表示時
<?php
@ini_set('session.gc_maxlifetime','10368000');
@ini_set('session.gc_divisor','1000');
@ini_set('session.cookie_lifetime','10368000');
@session_start();
if(isset($_SESSION['ID']) && $_SESSION['ID'] != null ){
echo "login";
}else{
echo "not login";
}
?>
実際のコードと少し違いますが、コレで再現されるはずです。

>>438
専用のサーバーなんで、パスは大丈夫です。
ありがとうございます。ログを吐き出してみますね。
0440nobodyさん2011/05/17(火) 16:32:03.90ID:JyZBkyIg
【OS名】fedora13
【PHPのバージョン】5.2
【質問内容】
// セッション開始
session_start();

// セッションデータを保存
$temp = $_SESSION;

// セッション変数を破棄
$_SESSION = array();
session_destroy();

// セッションを再作成
session_regenerate_id(TRUE);

// セッションIDを作成
session_id($this->makeSessionId("sha1"));

// セッションIDを再生成
session_start();

// セッションデータを元に戻す
$_SESSION = $temp;

【やりたい事】
自前のセッションID作成関数でワンタイムセッションを発行し続けたい
【問題点】
毎回セッションファイルが3つ増えていきます。
SESSIONに保存されたデータが渡されていません。
0441nobodyさん2011/05/17(火) 17:13:56.35ID:???
>>440
ウチのDebianのPHP/5.2.6-1+lenny10では問題なし。
ちなみにブラウザはIE6/7/8、Fx4。

リクエスト毎にちゃんとセッションID変わってる。
ゴミセッションファイルも残らない。
セッション変数も受け渡されてる。
レスポンスヘッダのSet-Cookieも重複なし。
0442nobodyさん2011/05/17(火) 18:13:15.25ID:JyZBkyIg
>>441
framework使ってた所為でファビコンアクセスで、余計なセッションが1つ出来てた。
デバックツールで更に1個余計だった

ただ、
session_id($this->makeSessionId("sha1"));
これ抜くと問題無いけど、入れると上手く動かなくなる。。。
0443nobodyさん2011/05/17(火) 19:48:13.04ID:???
>>442
>>437
0444nobodyさん2011/05/17(火) 20:09:37.08ID:???
どうせsession_start()前に何か出力しちゃってるとかでしょ
0445nobodyさん2011/05/17(火) 22:30:00.58ID:n5tnk9Oo
素直にsession_set_save_handlerつかえば
04463682011/05/17(火) 23:00:48.90ID:KShR6cC9
>>368です
ログを見てみたところ、なんとなく原因が分かりました。
/tmp/以下のセッションファイルが、あるはあるんですが、
空になってました。。。ブラウザのクッキーは生きてるみたいです。
なんか設定が足りないんですかね。。。
0447nobodyさん2011/05/17(火) 23:15:28.52ID:???
>>446
てことはログイン後の表示画面で常にnot loginが表示されるはずだよな
その時点で気づくだろ
04483682011/05/17(火) 23:25:28.48ID:KShR6cC9
>>447
最初はデータが入っていて、
-rw------- 1 hoge wheel 28 5 17 21:17 sess_de2115feb4047288c2d449474fe728de
と、loginになってるんですが、なんらかの原因で、
-rw------- 1 hoge wheel 0 5 17 21:17 sess_de2115feb4047288c2d449474fe728de
と、/tmp/以下のファイルの中身が空になるみたいです。
04493682011/05/17(火) 23:26:46.95ID:KShR6cC9
>>448
あ、時間はダミーです^^;
0450nobodyさん2011/05/17(火) 23:52:48.59ID:???
ちょおま!セッションIDを晒すなんて勇気あるな
04513682011/05/18(水) 00:07:54.18ID:yNJD7CyN
>>450
あ、IDもユーザー名もダミーですw
0452nobodyさん2011/05/18(水) 00:13:45.36ID:???
逆引きできた pingも通る
0453nobodyさん2011/05/18(水) 00:27:19.56ID:???
>>448
サーバーが再起動されてるということはないよね?
04543682011/05/18(水) 00:37:54.54ID:yNJD7CyN
>>453
お。。。まさかの再起動wwww確認してみますw
04553682011/05/18(水) 00:44:09.95ID:yNJD7CyN
>>453
大丈夫でしたw
0456nobodyさん2011/05/18(水) 02:27:01.57ID:???
>>455
logrotateにKILL -HUPされている予感
04574282011/05/18(水) 04:02:13.97ID:Byk8JbeP
分かる方いらっしゃらないようなので、他で聞いてみます。
失礼しました。
0458nobodyさん2011/05/18(水) 04:21:34.50ID:???
PHP関係ないし
<div name="top">top</div>
<br style="margin-top:2000px">
<div><a href="#top">top</a></div>
と原理は一緒だろ
0459nobodyさん2011/05/18(水) 04:23:08.75ID:???
なんかhtmlおかしかった<br>いっぱいはさむべし
0460nobodyさん2011/05/18(水) 04:45:51.42ID:???
>>457
多分 http://fw.mk-style.com/teaser/swf/website.swf をmain.phpで呼び出し先を変えてるだけ
0461nobodyさん2011/05/18(水) 04:55:03.43ID:???
古典的な手法だな。どちらかといえばJSスレ向けのネタ
今のモダンブラウザならURLまるごとかえれるしな
0462nobodyさん2011/05/18(水) 04:58:14.44ID:???
HTTPヘッダ見ればわかるけど通信はいっさいしてない
Flash側でふりわけてるんだろう
URLで最初に表示するFlashのコマを決めてるだけにすぎない
0463nobodyさん2011/05/18(水) 07:22:54.07ID:???
他で聞きますので皆さんもう回答しなくていいです
0464nobodyさん2011/05/18(水) 07:25:09.74ID:???
スレチですしね
0465nobodyさん2011/05/18(水) 13:23:19.33ID:???
>>457で他スレ行ってますしね
0466nobodyさん2011/05/18(水) 17:32:10.51ID:???
>>457は他スレじゃなくて知恵袋に行ったそうです
0467nobodyさん2011/05/18(水) 18:16:34.60ID:???
知恵袋のどこだろ
JavaScriptカテゴリにはいない
0468nobodyさん2011/05/18(水) 20:34:30.12ID:???
違いました。教えてgooでした。
0469nobodyさん2011/05/18(水) 21:31:34.31ID:???
教えてgooのどこだろ
JavaScriptカテゴリにはいない
0470nobodyさん2011/05/18(水) 21:34:32.53ID:???
無限ループこわい
0471nobodyさん2011/05/18(水) 21:59:54.46ID:IYv8F7QD
配列のツリー構造がどうしても出来ません・・。

$array[] = array('id' =>1, 'pid' => 0);
$array[] = array('id' =>2, 'pid' => 1);
$array[] = array('id' =>3, 'pid' => 2);

と言う配列を↓な感じのツリー構造にしたいのですが、

Array(
 [0] => array(
  'id' => 1,
  'parent' =>0,
  [1] => array(
   'id' => 2,
   'parent' => 1,
   [2] => array(
    'id'=>3
    'parent' => 2
   )
  )
 )
)

再帰しても上手くできません・・・。
function thread(&$array = array(), $pid = null){
 if ($pid == $array[$pid]) {
  return $array;
} else {
  $array[] = thread($array, $array["pid"]);
}
}
0472nobodyさん2011/05/18(水) 22:41:08.51ID:???
>>471
メリットが全く理解できないが

$array[0] = array('id'=>1, 'parent'=>0, '1'=>array('id'=>2, 'parent'=>1, '2'=>array('id'=>2, 'parent'=>1)));
var_dump($array);
0473nobodyさん2011/05/18(水) 22:48:27.63ID:???
>>472
>>471は再帰関数で実現したいと言っているのですよ。
0474nobodyさん2011/05/18(水) 22:51:38.92ID:???
>>473
わかってるよ、整理のために書いただけ
本題の件は pid を元に配列を作ってソートした後にforループで回して入れ子にすればいい
0475nobodyさん2011/05/18(水) 22:56:59.93ID:???
いや、pid を元に $array をソートするだけでいけるな
入れ子処理にforループ使うのは同じ
0476。2011/05/18(水) 23:09:46.63ID:???
条件がよくわからんから適当
なんか構造が変なので、pidの重複は上書きになっちまうが・・・

print_r ( thread($array , 0) );

function thread($array , $pid) {
$ret =array();
foreach( $array as $var => $val) {
if($val["pid"]==$pid){
$ret = array("id"=>$val["id"],"parent"=>$pid);
if($r = thread($array,$val["id"])){
$ret[$val["id"]]=$r;
}
}
}
if ($pid == 0) $ret = array(0=>$ret);
return $ret;
}
0477nobodyさん2011/05/18(水) 23:11:28.22ID:???
>>473
別に再帰関数で実現したいとは言ってませんよ
0478nobodyさん2011/05/18(水) 23:23:55.97ID:???
こうなるのか

$array[0] = array('id'=>1, 'parent'=>0);
$array[0][1] = array('id'=>2, 'parent'=>1);
$array[0][1][2] = >array('id'=>2, 'parent'=>1)));
0479。2011/05/19(木) 00:20:21.07ID:???
$arrayの添字って単に増えればよくて、idとか parentとまったく関係ないとか?
0480nobodyさん2011/05/19(木) 00:32:04.14ID:???
配列のツリー作りたいだけだろ?
子要素はchildかなにかにいれてく感じで・・・
0481。2011/05/19(木) 00:42:13.74ID:???
じゃあ、これでいいのか・・・
$array[] = array('id' =>1, 'pid' => 0);
$array[] = array('id' =>2, 'pid' => 1);
$array[] = array('id' =>3, 'pid' => 2);

$u = &$ret;
foreach($array as $var => $val) {
$u[$var] = $val;
$u = &$u[$var];
}
0482nobodyさん2011/05/19(木) 00:50:50.91ID:???
>>471をそのまま読むと>>476
けど>>481の方がわかりやすいから俺ならこっちを採用するな
■ このスレッドは過去ログ倉庫に格納されています