ホーム » ブログ » 2007年10月の記事

2007年10月の記事

« 2007年8月 | 2007年11月 »

PHPのarray_multisort関数が激便利だったので紹介

2007-10-17 | このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

追記:2007-11-08

[を] PHP の array_multisort は Schwartzian Transform 向きかなで鋭い指摘をいただきました。たしかに関数名から言っても「array_multisort」ですから、この例はusort向きでしたね...。

説明のシンプルさを求めるあまり本質が抜けおちてしまってました。反省です。苦しいですが、array_multisortの本質への「前段階」のシンプルな解説としてどうぞ。

array_multisort関数は、sort関数などではソートできないような多次元の配列をソートするためのPHPの関数です。SQLのORDER句に似た動作を配列に対して適用することができます。

たとえばこんな形式の売り上げデータがあったとします。

$sales = array(
  2 => array(
    'title' => 'ほげほげ1',
    'amount' => 3,
  ),
  1 => array(
    'title' => 'ほげほげ2',
    'amount' => 2,
  ),
  0 => array(
    'title' => 'ほげほげ3',
    'amount' => 5,
  ),
);

これをamountの多い順にソートしたいとき、array_multisort関数を使うと比較的すんなりソートできます。

まずはソート用の配列を下準備。

$amounts = array();
foreach ($sales as $v) $amounts[] = $v['amount'];

次にarray_multisortを実行します。返り値は成功か失敗のboolean値で、ソート結果は$salesに入ります。

array_multisort($amounts, SORT_DESC, SORT_NUMERIC, $sales);

$salesは以下のようになります。

array(
  0 => array(
    'title' => 'ほげほげ3',
    'amount' => 5,
  ),
  1 => array(
    'title' => 'ほげほげ1',
    'amount' => 3,
  ),
  2 => array(
    'title' => 'ほげほげ2',
    'amount' => 2,
  ),
)

なお、この関数の引数の構造は一般的ではありません。例えばタイトルで昇順ソートしたいときは以下のように書きます。($titlesはタイトルの配列)

array_multisort($titles, SORT_ASC, $sales);

以下もアリです。動作は上と同じです。

array_multisort($titles, $sales);

ポイントは以下の通り。

  • 最後の引数にソートしたい配列を渡す。(参照渡しになる)
  • ソート順(SORT_ASC,SORT_DESC)や、比較方法(SORT_REGULAR、SORT_NUMERIC、SORT_STRING)は渡したり渡さなかったりする。

さらに複数条件でソートすることもできます。詳しくはPHPマニュアルのarray_multisort関数の解説をどうぞ。

2007-10-17 written by akiyan | 記事 | 固定リンク | コメント (2) | トラックバック (0) | このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

リニューアル後のmixiを2カラム/750px幅化するユーザースタイルシートを書いてみた

2007-10-01 | このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

別に2カラム原理主義者というわけではないのですが、カラム変更オプションが無くなったのでついカッとなって書いてみました。

適用前、適用後

適用前 適用後

解説

Firefox向けで、ユーザースタイルシートの適用は「Stylish」拡張をインストールすると便利です。

2カラムにするだけではなく、個人的にほとんど使わない機能へのナビゲーションまで削除しちゃってるので、ちょっと注意が必要です。リニューアル後のmixiのHTMLはid名とclass名が変態的なまでにきっちり設定されているのでCSSがわかる方はソース眺めつつ調整してください。ユーザースタイルシートの内容は以下の通り

  • 調整
    • 全体の横幅 750px化
    • 全体を中央揃え
    • フッターリンク左右の余白調整
  • 非表示
    • 右カラム全部
    • ロゴ
    • バナー広告
    • ヘッダの背景
    • 動画・フォト・miklyボタン
    • プルダウンメニューボタン
    • 検索フォーム
    • 最新情報ヘッダ

ユーザースタイルシート

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain("mixi.jp") {

/* 全体を中央揃え */
body { margin:0 auto !important }
body { width:750px !important }

/* ロゴ非表示 */
h1 { display:none }

/* 広告バナー非表示 */
p.adBanner { display:none !important }

/* 右カラム非表示 */
#bodySub { display:none }

/* ヘッダの背景を透過色に */
#headerArea { background:transparent !important }

/* ヘッダエリアの幅調整 */
#headerArea { width:750px !important }

/* ヘッダの高さを自動に */
#headerArea { height:auto !important }

/* 本文エリアの幅調整 */
#bodyArea { width:750px !important }

/* グローバルナビゲーションの幅調整 */
#globalNavigation { width:750px !important }

/* グローバルナビゲーションのmikly・動画・フォトボタン非表示 */
#globalNavigation ul.contentsNavigation li.mikly { display:none !important }
#globalNavigation ul.contentsNavigation li.movie { display:none !important }
#globalNavigation ul.contentsNavigation li.photo { display:none !important }

/* ヘルプ・ログアウトボタン非表示(disabled) */
/* #globalNavigation ul.utilityNavigation li.help { display:none } */

/* ローカルナビゲーションの幅調整 */
#localNavigation { width:750px !important }

/* ローカルナビゲーションのレビュー・ミュージックボタン非表示 */
#localNavigation li.review { display:none }
#localNavigation li.music  { display:none }

/* ローカルナビゲーションのプルダウンボタン非表示 */
#diaryPullDownButton { display:none !important }
#videoPullDownButton { display:none !important }
#photoPullDownButton { display:none !important }

/* フッター幅調整 */
#footerArea { width:750px !important }

/* フッターナビゲーションマージン調整 */
#footerArea ul.footerNavigation01 li { margin:0 2px !important }

/* 検索フォーム非表示 */
div.searchForm01{ display:none }

/* 「最新情報」ヘッダの非表示 */
#mymixiUpdate div.heading01 { display:none }

}

/* コミュニティページ専用スタイル */
@-moz-document url-prefix("http://mixi.jp/view_community.pl") {

/* 入退会ボタンを表示 */
#localNavigation li.music  { display:inline !important }
}

コピペしてお使いいただくか、Stylishがインストール済みの場合はuserstyles.orgからワンクリックでインストールできます。調整はお好みでどうぞ。

更新履歴

  • 2007-10-01 フッター全部消してしまうと規約リンクまで消えてしまうことに配慮していなかったので、幅調整に変更しました。
  • 2007-10-01 ヘッダ領域に余白ができることがあったのでヘッダの高さを自動にしてみました。
  • 2007-10-01 横スクロールバーが出ないようにいろいろ幅調整しました。
  • 2007-10-01 フッターナビゲーションが1行におさまるように余白を調整しました。
  • 2007-10-02 日記・動画・フォトのプルダウンメニューを開くボタンを消しました。
  • 2007-10-02 ヘルプとログアウトボタンを元に戻しました(さすがにログアウトは使いますよね)。
  • 2007-10-02 最上位の動画・フォトボタンを消しました。
  • 2007-10-02 ナビゲーションが縮んだのでさらに15px削って幅を750pxにしました。
  • 2007-10-02 userstyles.orgに投稿しました。
  • 2007-10-02 どこかで拝見した中央揃えのアイデアがすごくよかったので取り入れさせていただきました。
  • 2007-10-06 コミュニティページの入退会ボタンを表示するようにしました。

非表示の基準

「幅が広がったためになんとなく置かれたんじゃないか」系のリンクから非表示にしました。最上位ナビゲーションにあったリンクはフッターには残ってますのでそちらからどうぞ。

2007-10-01 written by akiyan | 記事 | 固定リンク | コメント (48) | トラックバック (13) | このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

« 2007年8月 | 2007年11月 »