以前、JavaScriptの配列に関するメソッドについてまとめましたが、同じようにPHPの配列関数についてまとめてみました。
PHPの配列関数はたくさんあるので、とりあえず基本だけです。
| 関数 |
返り値 |
配列への影響 |
対応するJavaScriptのメソッド |
| array_shift($a) |
最初の要素を返す。 |
最初の要素が削除される。 |
a.shift() |
| array_unshift($a,要素) |
挿入後の配列の長さを返す。 |
先頭に要素が挿入される。 |
a.unshift(要素) |
| array_pop($a) |
最後の要素を返す。 |
最後の要素が削除される。 |
a.pop() |
| array_push($a,要素) |
挿入後の配列の長さを返す。 |
最後に要素が挿入される。 |
a.push(要素) |
| array_slice($a,$i,$j) |
0から数えてi番目からj個の要素を配列として返す。 |
なし。 |
a.slice(i,j) |
| array_splice($a,$i,$j,$b); |
なし。 |
0から数えてi番目からj個の要素を削除し別の配列に置き換えた配列になる。 |
a.splice(i,j) |
| array_splice($a,count($a),0,$b) |
なし。 |
配列の後に別の配列を追加した配列になる。 |
a.concat(配列) |
1桁の数「5」に「0」を追加して2桁「05」で表示するような手法を「ゼロ埋め」や「パディング」などと言います。
Excelには「TEXT」、VBAには「Format」、PHPには「sprintf」という関数がありますが、JavaScriptには見当たりません。
これを作ってみます。 続きを読む…
JavaScriptで配列をコピーするときは次のような注意が必要です。
配列変数aを配列変数bにコピーしています。
これで配列変数bをaの代わりに使うことができます。
次にpopを使ってaの最後の要素をクリアします。
この場合、bには何も影響しないように思われますが、実行結果は次のようになります。
bもaと同じく最後の要素がクリアされます。
つまり「b=a」とすると各要素がコピーされるのではなく「bはaを参照する」ということになるのです。
したがって各要素をコピーするためには次のようにします。
a=[10,20,30];
for(i=0;i<a.length;i++){
b[i]=a[i];
}
a.pop();
実行結果は次の通り。
意図通り、aだけが処理されました。
なお次のような簡単な方法もあります。
sliceを使うと配列を部分的に抜き出すことができます。
第1引数にセットした位置から第2引数にセットした位置の前まで抜き出します。
第1引数に「0」をセットし、第2引数を省略すると、最初から最後までを抜き出しますので、配列の各要素をコピーするのと同じ効果があります。
a=[10,20,30];
b=a.slice(0);
a.pop();
前に、VBAで「SelectCaseとIfで速いのはどっち?」というのを調べてみましたが、今度はJavaScriptで同じことをしてみました。なお、SelectCaseはswitchに置き換えます。
サンプルコードは省略しますが、同様の関数を作り、10000回繰り返したときの実行時間を測りました。
| サンプル |
時間 |
| 配列変数 |
0.5124秒 |
| switch |
0.0688秒 |
| if(単純) |
0.2594秒 |
| if(終了) |
0.0359秒 |
| if(場合分け) |
0.0359秒 |
面白いのはifの場合分けを使った場合の効果に違いが見られなかったことです。
|if%20(%E7%B5%82%E4%BA%86)|if%20(%E5%8D%98%E7%B4%94)|switch|%E9%85%8D%E5%88%97%E5%A4%89%E6%95%B0|0:|0|0.25|0.5)
東日本大地震が起きたのが3月11日。
ちょうど3か月が経過しました。
これを自動的にカウントするJavaScriptのコードを書いてみました。
document.write(count_ymd());
function count_ymd() {
var fdy = 2011,
fdm = 3 - 1,
fdd = 11;
var td = new Date();
var tdy = td.getFullYear(),
tdm = td.getMonth(),
tdd = td.getDate();
var dy = tdy - fdy;
var dm = tdm - fdm;
var dd = tdd - fdd;
if (dd < 0) {
dd = (new Date(tdy, tdm, 0)).getDate() - fdd + tdd;
dm--;
}
if (dm < 0) {
dm = dm + 12;
dy = dy - 1;
}
return ((dy > 0 ? dy + "年" : "") + (dm + "か月") + (dd > 0 ? dd + "日" : "ちょうど"));
}
JavaScriptの日付オブジェクトは、年、月、日とバラバラにセットして使いますが、日付を表す文字列をセットしても日付として認識します。
document.write(new Date("15 June 2008"));
これを実行すると次の通り表示されます。
Sun Jun 15 00:00:00 UTC+0900 2008
では、どのような日付文字列ならば正しく処理されるのでしょうか。 続きを読む…
「book」の「oo」のように文字の繰り返しを見付ける正規表現について調べました。
JavaScriptの場合
まず/.{2}/という表現を思い付きますが、これでは「同じ文字が2個並んだ文字列」になりません。単に「文字が2個並んだ文字列」です。1個目と2個目の文字が異なってもよいからです。
そこで次のようにします。
str="book";
ret=str.match(/(.)\1/g);
「oo」が返されます(正確にはret[0]として)。
JavaScriptの正規表現では「\1」を使うと括弧に挟まれた部分を取得できます。
/(.)/とすると任意の1文字が取得でき、\1に格納されます。
/(.)\1/とすると/\1\1/のように「同じ文字が2個並んだ文字列」を探すことになります。
秀丸の場合
検索文字列として「(.)\1」を指定します。
もちろん正規表現にチェックを入れます。
もし「同じ文字が2個以上並んだ文字列」を検索するならば「(.)\1+」とするとよいでしょう。
JavaScriptのmatchは正規表現に合致した文字列を配列で返します。
「g」を付けない場合と「g」を付ける場合で内容が変わります。
| gを付けない場合 |
gを付ける場合 |
0個目 合致した部分全体
1個目 1個目の括弧で括られた部分
2個目 2個目の括弧で括られた部分 |
0個目 最初に合致した部分全体
1個目 2番目に合致した部分全体 |
gを付けない場合のサンプル
str="xayxbyxcy";
ret=str.match(/(x.)y/);
ret[0]=”xay”
ret[1]=”xa”
「x□y」という文字列を探しています。
gがないので一つ見つけたら終わりです。
返り値の0個目は合致した部分全体です。「xay」になります。
返り値の1個目は合致した部分のうち括弧に挟まれた部分です。「(xa)y」と見て「xa」になります。
gを付ける場合のサンプル
str="xayxbyxcy";
ret=str.match(/(x.)y/g);
ret[0]=”xay”
ret[1]=”xby”
ret[2]=”xcy”
上のサンプルと同じく「x□y」という文字列を探しています。
gがあるので合致する文字列をすべて見付けます。
返り値の0個目は最初に合致した文字列です。
返り値の1個目は2番目に合致した文字列です。
返り値の2個目は3番目に合致した文字列です。
括弧に挟まれた部分を返すようなことはありません。
辞書の言葉の並び順はアイウエオ順ですが、「ー」という伸ばす音、長音があるときは、その前の音によって判断されます。
その前の音がア段ならば「ア」、イ段ならば「イ」となります。
例えば「ワード」ならば「ワアド」、「キー」ならば「キイ」として並び順が決まります。
となります。 続きを読む…
TwitterAPIなどを使い、JSON形式でデータを取得した場合、文字列が次のようになっている場合があります。
初めて見ると「文字化けか」と思ってしまうかもしれませんが、これはJSONのルール通りなんだそうです。
この「\uXXXX」形式は「Unicode文字エスケープシーケンス」、「unicode escape sequence」などと呼ぶそうです。
2.4.1 Unicode 文字エスケープ シーケンス (C#)
Unicodeにおける文字番号を4桁の16進数に置き換えて、頭に「\u」を付けます。
これをJavaScriptを使って人間が読める形にする方法(デコード)を調べました。
単純な方法
簡単なのは次のようにJavaScriptでページに書く方法です。
document.write("\u4eca\u671d\u306f");
これで次のように表示されます。
関数を使う方法
「json_str_decode」という関数を作ってみました。
このケースでは「\」が(JavaScriptの)エスケープシーケンスに該当してしまうので「\\」のようにしないと正しく認識しません。
document.write(json_str_decode("\\u4eca\\u671d\\u306f"));
function json_str_decode(str){
arrs=str.match(/\\u.{4}/g);
var t="";
for(i=0;i<arrs.length;i++){
t+=String.fromCharCode(arrs[i].replace("\\u","0x"));
}
return(t);
}
次のようにテキストエリアなどに貼り付けて使う場合には「\\」とする必要がありません。
<textarea id="ta">\u4eca\u671d\u306f</textarea>
<div id="mydiv"></div>
var a=document.getElementById("ta").value;
document.write(json_str_decode(a));
最近のコメント