plasmasphere.net -プラズマスフィア ドットネット-

Diary

« 1... 66 67 68 69 70 ...99 »

PHPでバブルソート

2006/10/05(Thu) 00:10

PHPのソート関数が無いかと探していたら、特に無かったのでバブルソート(Bubble Sort)をJava版からPHPに改変してみました。
rsortとか使えば同じ動作するんで別にいらないんですが…。
ところがどっこい、二次元配列のイチ要素に対してソートを実行しようとすると、そうもいかなかったわけで。

例えば…

Array
(
    [0] => 12
    [1] => 50
    [2] => 20
    [3] => 1574
    [4] => 67
    [5] => 54
    [6] => 2
    [7] => 35
    [8] => 21
)

みたいな配列は普通にrsort使えば問題ないんですが…

Array
(
    [0] => Array
        (
            [name] => 名前1
            [No] => 3
            [value] => ******
        )

    [1] => Array
        (
            [name] => 名前2
            [No] => 1
            [value] => ******
        )

    [2] => Array
        (
            [name] => 名前3
            [No] => 2
            [value] => ******
        )

    [3] => Array
        (
            [name] => 名前4
            [No] => 5
            [value] => ******
        )

    [4] => Array
        (
            [name] => 名前5
            [No] => 4
            [value] => ******
        )

)

みたいな配列をNo要素順にソートしようとするとうまくいかない。
いや、俺が間違ってるだけかもしれんが。

というわけでソース。

bsort.php

<?php

$val = array(12,50,20,1574,67,54,2,35,21);

echo "ソート前";
echo "<pre>";
print_r($val);
echo "</pre>";

bsort($val);

echo "ソート後";
echo "<pre>";
print_r($val);
echo "</pre>\n<hr />\n";


$arr = array(
			"0" => array( "name" => "名前1", "No" => "3", "value" => "******"),
			"1" => array( "name" => "名前2", "No" => "1", "value" => "******"),
			"2" => array( "name" => "名前3", "No" => "2", "value" => "******"),
			"3" => array( "name" => "名前4", "No" => "5", "value" => "******"),
			"4" => array( "name" => "名前5", "No" => "4", "value" => "******"),
		);

echo "ソート前";
echo "<pre>";
print_r($arr);
echo "</pre>";

bsort($arr, $flag = "No");

echo "ソート後";
echo "<pre>";
print_r($arr);
echo "</pre>\n<hr />";

/*
 * バブルソート
 * $val = ソートする配列
 * $flag = ソート対象の配列要素
 * $order = ソートの昇順・降順 デフォルトは昇順
*/
function bsort(&$val, $flag = "", $order = "ASC") {
	for($i=0;$i<count($val)-1;$i++){
		for($j=count($val)-1;$j>i;$j--){
			if($flag) {
				if($order=="DESC") {
					if($val[$j]["".$flag.""]>$val[$j-1]["".$flag.""]){
						$t=$val[$j];
						$val[$j]=$val[$j-1];
						$val[$j-1]=$t;
					}
				} else {
					if($val[$j]["".$flag.""]<$val[$j-1]["".$flag.""]){
						$t=$val[$j];
						$val[$j]=$val[$j-1];
						$val[$j-1]=$t;
					}
				}
			} else {
				if($order=="DESC") {
					if($val[$j]>$val[$j-1]){
						$t=$val[$j];
						$val[$j]=$val[$j-1];
						$val[$j-1]=$t;
					}
				} else {
					if($val[$j]<$val[$j-1]){
						$t=$val[$j];
						$val[$j]=$val[$j-1];
						$val[$j-1]=$t;
					}
				}
			}
		}
	}
}
?>

単純なバブルソート。
要素が30を超えてくると、動作がぬるぬるしだす辺りはやっぱりバブルソートだなぁ…と。
クイックソートはまた明日にでも。

参考:いろいろなソートアルゴリズム


サッカー

2006/10/04(Wed) 00:10

VSガーナ親善試合。
交代枠全部使ったのは楽しかった。
というか、交代しきった後の方が見てて楽しかったのは、きっと播戸と中村憲剛のお陰かな。

ところで巻君の足元が絶望的に下手糞なのは、どうにもならんのでしょうか。
走り出した選手の足元に出すパスが多すぎ。貰う方つんのめってるし。

今回は故障で加地さんがいなかったので残念でした。
代わりの駒野のDFがダメすぎて見てられないです。

まぁ、何でもいいから四年後とかにこんな感じに…なってたらいいなぁ。
http://www.youtube.com/watch?v=Qv-xC1GKmH8
と上の動画見てて2005年のコンフェデを思い出した。
http://www.youtube.com/watch?v=zIKt8BGhh8Y
後にも先にも、凄かったのはこれと同じコンフェデのギリシア戦くらいだったけど。


CSSでタブを作成する為のモジュール2

2006/09/30(Sat) 00:09

タブ型リンクを作成するCSSのモジュールその2。

CSS

.tab2 {
	margin:0;
	padding:5px;
	border-bottom:1px solid #aaa;
}

.tab2 li {
	display:inline;
}

.tab2 li a {
	padding:4px 7px;
	border:1px solid #aaa;
	border-bottom:none;
	margin-right:1px;
	background:#eee;
}

.tab2 li.active_tab a {
	padding:4px 7px;
	border:1px solid #aaa;
	border-bottom:none;
	margin-right:1px;
	background:#fefefe;
}

.tab2 li a:hover {
	padding:4px 7px;
	border:1px solid #aaa;
	border-bottom:none;
	margin-right:1px;
	background:#fefefe;
}

HTML

<ul class="tab2">
<li><a href="/attention.html">Information</a></li>
<li><a href="/archives/">Archives.html</a></li>
<li><a href="/links">Links</a></li>
</ul>

前回のと同じく、まるまるコピー&ペーストで使ってください。
前回と違うのは見た目と、タブが2行になってもなんとかなる所。
多分。


CSSでタブを作成する為のモジュール

2006/09/29(Fri) 00:09

所詮CSSだし、モジュールって言うほどのモンでもないけど、折角なので公開。

CSS

.tab {
	text-align:left;
	margin:0 0 10px 0;
	padding:0 5px 26px 5px;
	_padding-bottom:25px;
	border:1px solid #aaa;
	background:#ccc;
}

.tab li {
	display:inline;
}

.tab li a {
	display:block;
	padding:5px 10px;
	margin-right:4px;
	border:1px solid #aaa;
	border-width:0 1px;
	background:#eee;
	float:left;
	width:100px;
	text-decoration:none;
	text-align:center;
}

.tab li.active_tab a {
	background:#fefefe;
}

.tab li a:hover {
	text-decoration:none;
	background:#f8f8f8;
}

.tab li.active_tab a:hover {
	text-decoration:none;
	background:#fefefe;
}

HTML

<ul class="tab">
<li><a href="/attention.html">Information</a></li>
<li><a href="/archives/">Archives.html</a></li>
<li><a href="/links">Links</a></li>
</ul>

説明するまでもないと思いますけど一応。
ULタグの下にあるLIタグの中にあるAタグをブロック要素にしています。
ワカンネって場合は、とりあえずCSSとHTMLのコードまるまるコピーするとそのまま使えますよ。
ハミ出るって場合は、他のCSSが干渉してるかもしれないので、.tab li a の paddingの値なんかを変更してみてください。


Oracleでページ替え

2006/09/28(Thu) 00:09

先日Oracleを使う機会があって、今まで使ってたMySQL,Postgres SQLと少し違って苦労した点を…。
何でLIMIT使えんのかと。

Webシステムを作ってると、絶対にページ替えってやつはついてまわってくるんですが、それをプログラムとデータベースでやろうと思いまして。
要は、データベースにアクセスするときに…
1ページの場合はデータベースの実行結果の0行目から9行目を返す。
2ページの場合はデータベースの実行結果の10行目から19行目を返す。
って感じでやれば良いんですが、何かOracleさんには良いクエリが無いようで。
一応、指定の行を返すクエリのROWNUMってヤツがあるんですが、こいつがイマイチ使い勝手が悪くて、データを降順で出力したとしても、行はそれに定義されてないんですね。
例えば値段でソートしたとして

行(ROWNUM)商品名値段
1商品1100円
18商品15200円
36商品6300円
5商品23400円

みたいな感じで、実行した結果に行(ROWNUM)を振って、それをさらに値段で降順にソートするから、行の番号は狂い咲き。
かと言ってソートした後にROWNUMを指定するとクエリエラーが返ってくる素敵仕様。
Oracleはおバカちゃんですねとか思いながら、Google大先生に質問を投げかけて、やっと見つけました。
SELECTを入れ子にすればいいんですね。
ただ、降順ソートした結果に行(ROWNUM)を振って、さらにその行(ROWNUM)の0番目から10番目を取り出すとかクエリを書くと、もうアホかってくらいSQL文が伸びます。

SELECT ,商品名,値段 FROM (
	SELECT ROWNUM as ,商品名,値段 FROM (
		SELECT 商品名,値段 FROM 在庫状況 ORDER BY 値段 ASC
	)
) WHERE  between 0 AND 10

値段を降順で取得するようにクエリを渡した実行結果の、値の順番に行番号を振って、その行番号の0から10を取り出す、って読むといいです。
考えればこの方法しかないのはすぐ分かるんだけど、実際やってるとそうそう思いつかないもんです。

地味なトコで地味に詰まったので書き残しておきます。
ていうかWebサービスでOracle使うなと。MySQLで充分だろうと。

真面目に日記書いたのはじめてかもしれない、そんなサイト6年目の秋の夜。

参考にしたページ
http://d.hatena.ne.jp/yone098/20060823/1156329508

ネタ不足に負けた、自分がいます。
実際仕事の結果得られたものを書くと、頑なに拒んできた何かが自分の中で崩れていく非常に悲しい思いに駆られます。
拒んできた何かは何か分かりません。分かりたくありません。実感したくありません。
だから言わないで下さい。お願いします_| ̄|○


今月

2006/09/26(Tue) 00:09

名詞ケース 1000円
早起き 三文の特
新幹線代 25400円

実りの無い会議 Priceress

出張の意味が無い、経費節減はSkypeで。

システムの要望出しは一旦切って、区切りを決めてリリースしましょう。
って言った矢先に新しい要望がでてくる始末。

分かった、あんたができる人なのは分かったから、決め事を先に決めよう、な?

と言えたらなんと楽な事か。

お願いだから会議の議題は遵守しましょうね…。


出張

2006/09/20(Wed) 00:09

出張してきました。
東京まで行ったんですが、移動時間6時間、会議3時間。
のべ9時間。

実りの無い会議でした…。
正直Skypeの会議で良いと思うんですよね、確か5人くらい同時に音声チャット参加できたはずだし。

でまた行く度にプロジェクトの事で揉める揉める。
結局私がメインプログラマで推し進めざるを得ない状況に('A`)
まぁ、今までも実質私1人で開発をやってたので特に変わりは無いんだけど。

自分が先に怒っといて、後で相手がキレたらほっとくとか、もうヤメテって感じなんですが…。
今回はどっちが悪いとも言えないですけど。

こんだけじゃ何の事やら分からないと思うので、また纏めてから書きますね…。


ネットニュース

2006/09/14(Thu) 00:09

読んで爆笑した。
爆笑というか、呆れた。

次の文章は、とある新聞記事からの抜粋である。
文章を読んで設問に答えよ。

今、若い女性には「愛されOL」系のモデル、エビちゃん(蛯原友里)が 人気だが、これからは男性にとっての理想像も 「さわやか正社員」系に なるのかもしれない。そういえば( 1 )も、多少気になるところだが、

問1.( 1 )に入る適切な文を以下の選択肢から選べ。
A.秋冬もののトレンド
B.環境に配慮したクールビズ・ウォームビズ
C.女性達からの目
D.自らの国家や民族に固執する右翼系の若者が世界的に増えているという事実

答え http://www.asahi.com/culture/fashion/TKY200609110089.html


« 1... 66 67 68 69 70 ...99 »


 
© 1999- plasmasphere.net All rights reserved.