php/memo
Last-modified: 2010-06-18 (金) 15:05:02 (43d)
memo †
phpでファイルを扱う †
header("Content-Description: File Transfer");
header("Content-disposition: attachment; filename={$fileName}");
header("Content-type: application/octet-stream; name={$fileName}");
header("Expires: {$gmtDate}");
header("Content-Length: {$fileSize}");
ob_clean();
flush();
readfile($pdfFile);
?php class ArrayExt? {
// keyを保存する array_mergeです。 // ArrayExt.merge(array("a"=>1,0=>1), array("b"=>2,0=>2),array("c"=>3)) => array("a"=>1,0=>2, "b"=>2,"c"=>3); static function merge() { $args =func_get_args(); $ret = $args[0]; array_shift($args); foreach($args as $arr) { foreach($arr as $k=>$v) { $ret[$k] = $v; } } return $ret; } // arra_mapの 二引数版 // sample // [JS] ArrayExt.arrayMap2(function(x,y){return x*y;}, [1,2,3], [2,3,4] ) => [2,6,12] // [JS] ArrayExt.arrayMap2(function(x,y){return x+y;}, {"pric":1000,"ntax":999}, {"other":1,"pric":2100,"ntax":100},1) => {"pric":1100,"ntaz":1099} static function arrayMap2($proc, $arr1, $arr2, $syncKey= false) { $ret =array(); if ($syncKey) { foreach($arr1 as $k => $val) { $val2 = $arr2[$k]; $ret[$k] = $proc($val,$val2); } } else { reset($arr2); foreach($arr1 as $k => $val) { list ($_, $val2)= each($arr2); $ret[$k] = $proc($val,$val2); } reset($arr2); } return $ret; }
// 配列をツリーとみなしてmapする.
// sample
// [js] ArrayExt.arrayTreeMap(function(x){return x*2;}, [[[[[[1]]]]],2,[[[[4],2,3]]]]) => [[[[[[2]]]]],4,[[[[8],4,6]]]]
// ArrayExt::arrayTreeMap(array("Format","trimfb"), array(array(array(" test "),array(" test2 "))) => array(array(array("test"),array("test2")))
static function arrayTreeMap($proc, $arrayTree) {
if (!is_array($arrayTree)) {
return $arrayTree;
}
if (is_array($proc)) {
return self::arrayTreeMapArr($proc,$arrayTree);
} else {
return self::arrayTreeMapStr($proc,$arrayTree);
}
}
static function arrayTreeMapStr($proc, $arrayTree) {
$ret = array();
foreach($arrayTree as $k => $val) {
if (is_array($val)) {
$val = self::arrayTreeMapStr($proc,$val);
} else {
$val = $proc($val);
}
$ret[$k] = $val;
}
return $ret;
}
static function arrayTreeMapArr($proc, $arrayTree) {
$ret = array();
foreach($arrayTree as $k => $val) {
if (is_array($val)) {
$val = self::arrayTreeMapArr($proc,$val);
} else {
$val = call_user_func($proc,$val);
}
$ret[$k] = $val;
}
return $ret;
}
// 配列から$n個の値を取り出します。
// ArrayExt::take(array(1,2,3,4,5,6,7,8,9,10), 4) => array(1,2,3,4)
static function take ($arr, $n) {
$ret =array();
foreach ($arr as $k=>$e) {
if ($n> 0) {
$ret[$k] =$e;
} else {
break;
}
$n--;
}
return $ret;
}
// 配列の先頭のn個を抜きます。
static function drop ($arr, $n) {
$ret =array();
foreach ($arr as $k=>$e) {
if ($n<= 0) {
$ret[$k] =$e;
}
$n--;
}
return $ret;
}
// 先頭に値を入れます。[keyを変えません。]
// ArrayExt::pushHead(array("b"=>"B","c"=>"C"), "a", "A") => array("a"=>"A","b"=>"B","c"=>"C")
static function pushHead($array,$key,$val) {
$ret = array($key=>$val);
foreach($array as $k => $v) {
$ret[$k] = $v;
}
return $ret;
// keyが保存されない return array_merge(array($key=>$val) ,$array);
}
//配列の最大の値を返します。 (配列の要素に<出来ない値がある場合は未定義です。)
//nullは無視します。0は無視しません。
// ArrayExt::max(array(1,2,3,3,4,5,6)) => 6
static function max($arr, $max = null) {
foreach($arr as $v) {
if (!$v && $v !==0)
continue;
if($max === null) {
$max = $v;
}
if ($max < $v) {
$max = $v;
}
}
return $max; // null or number
}
// 配列の各要素の値を第一引数の関数で更新した場合の最大の値を返します。
// -- 元の値の方がいいかもしれません。
// [JS] ArrayExt.maxBy(function (x) {return x*x;},[0, -1, 1, 100,-1]) => 10000
static function maxBy($term, $arr, $knil = null) {
foreach($arr as $v) {
if (!$v && $v !==0) // $v2 をチェックした方がいい?
continue;
$v2 = $term($v);
if($knil === null) {
$knil = $v2;
}
if ($knil < $v2) {
$knil = $v2;
}
}
return $knil; // null or number
}
// 配列の最小の値を返します。
// ArrayExt::min(array(1,2,3,3,4,5,6)) => 1
static function min($arr, $min = null) {
foreach($arr as $v) {
if (!$v && $v !==0)
continue;
if($min === null) {
$min = $v;
}
if ($min > $v) {
$min = $v;
}
}
return $min; // null or number
}
// 配列の各要素の値を第一引数の関数で更新した場合の最小の値を返します。
// [JS] ArrayExt.minBy(function (x) {return x*x;},[0, -1, 1, 100,-1]) => 0
static function minBy($term, $arr, $knil = null) {
foreach($arr as $v) {
if (!$v && $v !==0) // $v2 をチェックした方がいい?
continue;
$v2 = $term($v);
if($knil=== null) {
$knil = $v2;
}
if ($knil > $v2) {
$knil = $v2;
}
}
return $knil; // null or number
}
// 配列の各要素のキーが、第二引数の配列$keysに含まれている要素のみを取り出します。
// ArrayExt::arrayFilterKeys(array("id"=>1,"name"=>"2","value"=>3, "class"=>4), array("name","class")) => array("name"=>"2", "class"=>4)
static function arrayFilterKeys($arr, $keys) {
$ret = array();
foreach($arr as $key => $v) {
if(in_array($key, $keys))
$ret[$key] = $v;
}
return $ret;
}
// 2次元配列の各要素のキーが、第二引数の配列$keysに含まれている要素のみを取り出します。
// ArrayExt::array2dFilterKeys(array(array("id"=>1,"name"=>"2","value"=>3, "class"=>4),array("name"=>"name2","class"=>"class2"))
// , array("name","class"))
// => array(array("name"=>"2", "class"=>4),array("name"=>"name2","class"=>"class2"))
static function array2dFilterKeys($arr, $keys) {
$ret = array();
foreach($arr as $key => $v) {
foreach($v as $key2 => $v2) {
if(in_array($key2, $keys))
$ret[$key][$key2] = $v2;
}
}
return $ret;
}
// $a=array(1,3,4);ArrayExt::swap($a,0,2);$a => array(4,3,1)
static function swap(&$arr, $i, $j) {
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
// $n個の数を返します。
// arrayExt::iota(10) => array(0,1,2,3,4,5,6,7,8,9,10);
static function iota($n, $start=0, $step= 1) {
$ret =array();
for($i =0, $val =$start;$i<$n;$i++, $val += $step){
$ret[]=$val;
}
return $ret;
}
static function randomPermutation($n, $start=0, $step=1) {
$ret = self::iota($n,$start,$step);
$rndMax=$n-1;
for($i = 0 ; $i < $n ; $i++) {
ArrayExt::swap($ret, $i, mt_rand(0, $rndMax));
}
return $ret;
}
// 0から$n個の数を重複なくランダムで返します。
// ArrayExt::randperm(10) => ランダム => array(4,3,5,9,0,6,1,7,2,8);
static function randperm($n, $start=0, $step=1) {
return self::randomPermutation($n, $start, $step);
}
// 配列をランダムで並び変えます。
function shuffle($arr) {
$n = count($arr);
$perm = self::randperm($n);
$ret = array();
for($i=0; $i<$n;$i++) {
$ret[$i] = $arr[$perm[$i]];
}
return $ret;
}
static function curry ($func) {
$args = func_get_args();
array_shift($args); // $func
$argsset = "";
foreach($args as $arg) {
$argsset .= '$args[]=unserialize(\''.serialize($arg)."');";
}
$str = '$args1=func_get_args();$args=array();'.$argsset.'foreach($args1 as $arg){$args[]=$arg;};return call_user_func_array("'.$func.'", $args);';
return create_function('', $str);
}
static function curryL ($func) {
$args = func_get_args();
array_shift($args); // $func
$argsset = "";
foreach($args as $arg) {
$argsset .= '$args[]=unserialize(\''.serialize($arg)."');";
}
$str = '$args=func_get_args();'.$argsset.'return call_user_func_array("'.$func.'", $args);';
return create_function('', $str);
}
// identity function
static function dummy($x) {
return $x;
}
// inc
static function dummy2($x) {
return $x+1;
}
}
js
rock = function (pt) {
this["rock"] = function () {
}
this["rock"].prototype = pt;
for (var key in pt) {
this["rock"][key] = pt[key];
}
this["rock"]["global"] = this;
};
rock({ byid:function (x) {
return document.getElementById(x);
}
,byname:function(x, fm){
fm = fm ? fm : "fm";
return document[fm][x];
}
, defclass : function (name, supers, pt) {
this[name] = function () {
//コンストラクタの呼び出し
if (this[name])
this[name]();
};
var proto = {};
if(supers && supers.length > 0) {
for(var i in supers) {
var spt = supers[i].prototype;
for(var key in spt) {
proto[key] = spt[key];
}
}
for(var key in pt) {
proto[key] = pt[key];
}
}else {
proto = pt;
}
this[name].prototype = proto;
for (var key in proto) {
this[name][key] = pt[key];
}
}
,use:function(klass, funcs) {
if (klass == "rock") {
if (funcs === true) {
for(var k in rock) {
rock.global[k] = rock[k];
}
} else {
for(var k in funcs) {
rock.global[funcs[k]] = rock[funcs[k]];
}
}
}else {
if (funcs === true) {
for(var k in rock) {
rock.global[k] = rock[klass][k];
}
} else {
for(var k in funcs) {
rock.global[funcs[k]] = rock[klass][funcs[k]];
}
}
}
}
,isObject: function (o) {
if(typeof o=="undefined"){
return false;
}
return (typeof o=="object"||o===null||rock.isArray(o)||rock.isFunction(o));
}
,isFunction: function(o) {
return (o instanceof Function||typeof o=="function");
}
,isArray: function (o) {
return (o&&o instanceof Array||typeof o=="array");
}
,isString: function(o){
return (typeof o=="string"||o instanceof String);
}
,isBoolean: function(o){
return (o instanceof Boolean||typeof o=="boolean");
}
,isNumber: function(o){
return (o instanceof Number||typeof o=="number");
}
,isUndefined:function(o){
return ((typeof (o)=="undefined")&&(o==undefined));
}
// class名を変えるかもしれません。
// input textをenable かdisableに変える。
,enable:function(x) {
x.disabled=false;
x.style.background = "#F5F5F5";
}
,disable:function(x) {
x.disabled=true;
x.style.background = "#999999";
x.value="";
}
//税額計算
, calcNtax:function(str) {
var res = str.match(/ *([0-9]+) */);
if (res) {
var pric = parseInt(res[0]);
return Math.round(pric / 1.05);
} else {
return "";
}
}
//
,obj2str:function (o) {
var ret = "";
var i = 0;
for(var k in o ) {
if (i %5 == 4) {
ret += "\n";
}
ret += o[k] + "\t";
i++;
}
return ret;
}
, show: function (o) {
alert(rock.obj2str(o));
}
});
rock.defclass("Array",[], {
head: function (arr) {
for(var k in arr) {
return arr[k];
}
return null;
}
,headKV: function (arr) {
for(var k in arr) {
return [k, arr[k]];
}
return null;
}
,foldl:function(term,knil,arr) {
for(k in arr) {
knil = term(knil,arr[k]);
}
return knil;
}
,map:function(term,arr) {
}
});
rock.defclass("Functional",[], {
curry:function (fn, scope) {
var scope = scope || window;
var args = [];
for (var i=2, len = arguments.length; i < len; ++i) {
args.push(arguments[i]);
}
return function() {
for (var i=0, len = arguments.length; i < len; ++i) {
args.push(arguments[i]);
};
return fn.apply(scope, args);
}
}
});