MW211 EXIT

devlog
PHP/配列のランダムな並び替え
2011年11月20日
┌──────────────────────────────────────┐
│shuffle($配列);                                                             │
└──────────────────────────────────────┘
配列から適当に値を取得する場合、添字を乱数で作成する方法もあるが、
「shuffle()」で適当に並び替えて、「$配列[0]」と先頭を取得する方法もある。

こっちだと、乱数で作成する添字の範囲(つまり配列が何件あるか)とか
気にしなくてよく、シンプルにできる。

ただし、並び替えた配列の添字(キー)は新たに割り当てられるので
元の姿をとどめないものだと思って使うべきだ。
(元の姿なんか関係ない場合にはかなり有効)

元の姿をとどめたい場合には、一旦ダミー配列にコピーしてから、
そっちを並び替えればよい。
┌──────────────────────────────────────┐
│$ダミー配列 = 配列;                                                         │
│shuffle($ダミー配列);                                                       │
└──────────────────────────────────────┘
分類:PHP配列
ブラウザのリロード
2011年11月19日
なんだか、あいまいなので整理。

以下は同じ。(ただし、IEのみで確認)
  ・ブラウザ上のリロードボタン(を押す)
  ・「f5」
  ・「ctrl」+「r」

キャッシュをクリアしたい場合は以下
  ・「ctrl」+「f5」
分類:ブラウザ
JavaScript/値の確認
2011年11月18日
「abc」という変数があって、処理中の値を知りたい場合、
そこにalert()文を入れてダイアログ出力して確認するというのは常套手段だ。
┌──────────────────────────────────────┐
│alert(abc);                                                                 │
└──────────────────────────────────────┘
上記みたいな感じ。(BASICのPRINT文みたいなもんだ)

でも、そのダイアログの内容をエディタで編集したいと思っても、
ダイアログ内容のコピー&ペーストができない。

そこで、代替案。
クリップボードへ出力するのだ。
┌──────────────────────────────────────┐
│clipboardData.setData("Text", abc);                                         │
└──────────────────────────────────────┘
こんな感じ。

実行した場合、IEだと
「このWebページがクリップボードへアクセスすることを許可します?」みたいな
警告文を一応表示して許可を求めてくるので、「アクセスを許可する」を選ぶ。

これで、クリップボードへ格納されたので、メモ帳とかを開き
「貼り付け」(ctrl+v)をすれば、値を取得できる。

IE以外のブラウザについては、
やったことがなくどんな挙動になるかは知らないのであしからず。
分類:JavaScript
PHP/URLエンコード
2011年11月17日
まずは、基本から。
┌──────────────────────────────────────┐
│エンコードされた値 = urlencode(元の値);                                     │
├──────────────────────────────────────┤
│元の値 = urldecode(エンコードされた値);                                     │
└──────────────────────────────────────┘

で、実用編。
GETパラメータで日本語を扱いたい場合、
例えば年号をそのままパラメータとしたい場合、以下のような感じになる。
┌──────────────────────────────────────┐
│http://….php?nengo=平成                                                    │
└──────────────────────────────────────┘

これくらいなら問題ないけど、記号とか絡んでくるとややこしいので、
┌──────────────────────────────────────┐
│「%E5%B9%B3%E6%88%90」 ← urlencode('平成')                                 │
└──────────────────────────────────────┘
上記のようか感じでエンコードして、それで渡してあげる。
┌──────────────────────────────────────┐
│http://….php?nengo=%E5%B9%B3%E6%88%90                                      │
└──────────────────────────────────────┘
んでもって、受け取る側でデコードして元に戻して受け取るという感じ。
┌──────────────────────────────────────┐
│「平成」 ← urldecode($_GET['nengo])                                        │
└──────────────────────────────────────┘
これは文字コード「UTF-8」の場合の例です。

送り側も、受け側も同じ文字コードであれば問題ないけど
もし、違う文字コードの場合は文字コード変換とか絡んでくるのだろう。
分類:PHP
PHP/配列の並び順が意図した通りかの判定
2011年11月16日
値がしっかりと昇順になっているものと、なっていないものがあった場合
これを判定したいとする。

例えば以下の二つの配列のうち、$bは不正だとはじきたい場合などだ。
┌──────────────────────────────────────┐
│$a = array(0=>0, 1=>1, 2=>2);                                               │
│$b = array(0=>0, 1=>2, 2=>1);                                               │
└──────────────────────────────────────┘

一旦、ダミーをつくりそれを「arsort()」で昇順ソートする。
┌──────────────────────────────────────┐
│$a_dummy = $a;                                                              │
│arsort($a_dummy);                                                           │
└──────────────────────────────────────┘
んでもって、元の配列と比較して、差分がなければ(変化がなければ)
昇順だったってことになる

しかし、ここで注意しなければならないのは「array_diff()」を使わないこと
┌──────────────────────────────────────┐
│if (array_diff($a, $a_dummy)) {                                             │
│  echo '昇順でない';                                                        │
│}                                                                           │
└──────────────────────────────────────┘
この関数は並び順度外視で、要素の比較だけに専念するので
差分なしと判定されてしまう。

正しくは「!==」で厳密に比較してあげればよい。
┌──────────────────────────────────────┐
│if ($a !== $a_dummy) {                                                      │
│  echo '昇順でない';                                                        │
│}                                                                           │
└──────────────────────────────────────┘
これなら並び順が違うだけでも、検出してくれる。

なお、降順で判定したい場合は、「asort()」を「arsort()」にすればいい。
分類:PHP配列
jQuery/入力チェック入門編
2011年11月15日
jQueryがよくわからないので、初歩的なところから外堀を埋めてみようと思う。

まずは、以下みたいな入力欄があって、それを全部チェックしたい場合(の基礎)。
┌──────────────────────────────────────┐
│<input type="text" name="xxxx1" value=""/>                                  │
│<input type="text" name="xxxx2" value=""/>                                  │
│<input type="text" name="xxxx3" value=""/>                                  │
│<input type="text" name="xxxx[]" value=""/>                                 │
│<input type="text" name="xxxx[]" value=""/>                                 │
│<input type="text" name="xxxx[]" value=""/>                                 │
└──────────────────────────────────────┘

チェック内容はその場に応じてなので、alert()で値をダイアログ表示する方法を。
┌──────────────────────────────────────┐
│$("input[type=text][name^=xxxx]").each(function() {                         │
│  alert($(this).val());                                                     │
│});                                                                         │
└──────────────────────────────────────┘
「$(this).val()」(=値)の内容をチェックするばよい。

ちなみに「.val()」を使わずに「.value」を使いたい場合には
「$(this).value」ではなく、「$(this)[0].value」だから注意。
分類:jQuery
CSS/リンクの点線囲みを表示させない
2011年11月14日
Firefoxとかで、リンクみたいな文字を選択すると、点線の囲いが出る時がある。
その回避方法。
┌──────────────────────────────────────┐
│a {                                                                         │
│  outline:none;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
「outline」属性を「none」にしてあげればよい。
分類:CSS
PHP/多次元配列の値を収集
2011年11月13日
多次元配列の値のみをまとめて一次元配列として取り出す方法はないものか?
最終的には「implode()」とかで、CSV形式で一列にしたりしたい。
ってことで、そんな関数がないかと探しているが見当たらないので
関数を作ってしまうことにした。

ふたパターンつくってしまった(結果は同じ)。
┌──────────────────────────────────────┐
│function getValueInArray($array) {                                          │
│  static $return = array();                                                 │
│  foreach($array as $value) {                                               │
│    if (is_array($value)) {                                                 │
│      getValueInArray($value);                                              │
│    } else {                                                                │
│      $return[] = $value;                                                   │
│    }                                                                       │
│  }                                                                         │
│  return $return;                                                           │
│}                                                                           │
├──────────────────────────────────────┤
│function getValueInArray($array) {                                          │
│  $return = array();                                                        │
│  foreach($array as $value) {                                               │
│    if (is_array($value)) {                                                 │
│      $return = array_merge($return, getValueInArray($value));              │
│    } else {                                                                │
│      $return[] = $value;                                                   │
│    }                                                                       │
│  }                                                                         │
│  return $return;                                                           │
│}                                                                           │
└──────────────────────────────────────┘

例えば以下のような多次元配列を投入すると、
┌──────────────────────────────────────┐
│$array = array('a',                                                         │
│               'B' => array('ba', 'bb'),                                    │
│               'C' => array('CA' => array('caa')));                         │
├──────────────────────────────────────┤
│├a        ←これと                                                         │
│├B                                                                         │
││├ba     ←これと                                                         │
││└bb     ←これと                                                         │
│└C                                                                         │
│  └CA                                                                      │
│    └caa  ←これを採取する                                                 │
└──────────────────────────────────────┘
以下のような結果となる(print_r()で出力)
┌──────────────────────────────────────┐
│Array ( [0] => a [1] => ba [2] => bb [3] => caa )                           │
└──────────────────────────────────────┘
分類:PHP配列
HTML/POSTのサブミットボタンいろいろ
2011年11月12日
基本的なサブミットボタンはこれ。
┌──────────────────────────────────────┐
│<input type="submit" name="command" value="実行"/>                          │
└──────────────────────────────────────┘

ボタンにJavaScriptを付加して、サブミットボタンにするには、
以下の二通りの方法がある。
┌──────────────────────────────────────┐
│<input type="button" onclick="this.form.submit();" value="実行">            │
├──────────────────────────────────────┤
│<input type="button" onclick="submit(this.form);"  value="実行">            │
└──────────────────────────────────────┘
ただし、ボタンなのでvalue値はPOSTパラメータとして渡せない。
つまり、上記二つに「name="command"」を追記しても、
「POST['command']」では値を拾えない。
最初のサブミットのやつだと「POST['command']」は「実行」という値になる。

では、ボタンではなくリンク文字にサブミットを埋め込む場合は?
┌──────────────────────────────────────┐
│<a href="javascript:void(0);" onclick="submit(this.form);">実行</a>         │
└──────────────────────────────────────┘
「javascript:void(0);」によって、リンクを無効にして(飛ばないようにして)、
onclickでさきほどのようにサブミットしてしまう。

ちなみに以下も同じかと思いきや、ダメだった。
┌──────────────────────────────────────┐
│<a href="javascript:void(0);" onclick="this.form.submit();">実行</a>        │
└──────────────────────────────────────┘

------------------------------------
【追記】
「onclick="submit(this.form);"」でも
場所によってうまくいかないことがあった。
formにidをつけて「$('id').submit();」みたいな方が確実なようだ。
※「function $(inId) {return document.getElementById(inId);}」付きでね
------------------------------------

なにもリンクにこだわらなくてもいい、文字をリンクに偽装してしまえばいいのでは
…というのであればこれ(あ、文字色がどうにもならないか)。
┌──────────────────────────────────────┐
│<span style="cursor:pointer;text-decoration:underline;"                       
                                      onclick="submit(this.form);">実行</span>│
└──────────────────────────────────────┘

他にもいろいろあって、他の回でもリンクでサブミットはとりあげているから
そのうちまとめられるといいですね。
分類:HTML
PDO/件数を取得する方法
2011年11月11日
「SELECT 列 FROM 表 WHERE 条件;」みたいな元SQL文があるとして、
その件数を取得したい場合がある。

ま、単純にはこんな感じで囲ってやれば、
たいていの場合は対応できる(元SQLにDISTINCTとかが絡んでてもOK)のだけど…。
┌──────────────────────────────────────┐
│SELECT COUNT(*) FROM (SELECT 列 FROM 表 WHERE 条件) AS dummy;               │
└──────────────────────────────────────┘

でも、単に件数を取得するだけのためにいちいちSQL文を作成したくはない。
そんなのPDOでなんとかしてくれないの、ってことで代替案。
#例によって「$sth->execute();」の直後の処理って想定でお話を進めます

Countというキーワードを元に「columnCount()」ってメソッドにぶち当たったのだが
これは単にSELECT文に指定した列数を取得するっていう、畑違いのメソッドだった。

さて、気を取り直して大本命の「rowCount()」ってメソッド。
┌──────────────────────────────────────┐
│$count = $sth->rowCount();                                                  │
└──────────────────────────────────────┘
でもこれって、「INSERT、UPDATE、DELETE」といった更新系処理の実行件数であり
「SELECT」の件数としてはあいまいな感じの扱いなのだ。
#どうやら、読み込み完了前に件数を算定する恐れがあるっぽいみたい

ま、信頼性が低いのであれば致し方ない。
ってことで、結論としては「fetchAll()」メソッドで全件取得しちゃって、
「count()」関数で数えちゃえばってことになりました。
┌──────────────────────────────────────┐
│$count = count($sth->fetchAll());                                           │
└──────────────────────────────────────┘
これでもコーディング量的には前出の「rowCount()」メソッドと比べても
そんなに大差ないのでいいのではないでしょうか
分類:PDO
前へ 1 2 3 次へ