PHP


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


Tips

ユーザー関数の引数を参照渡しで呼び出す

call_user_func では引数を参照渡しできない。
なので、call_user_func_arrayの第二引数へ参照を含む配列を渡す。

function bbb(&$str)
{
	$str = 'bbb';
}
 
$str = 'aaa';
 
call_user_func('bbb', $str);
echo $str;  // aaa : call_user_funcは参照を引数に取れない
 
call_user_func_array('bbb', array($str));
echo $str;  // aaa : 参照の配列を渡していない
 
call_user_func_array('bbb', array(&$str));
echo $str;  // bbb : OK

ユーザー関数の引数を連想配列で呼び出す

PHP5以上

function call_user_func_assoc($func, $array) {
	$reflect = NULL;
	if(is_array($func)){
		$reflect = new ReflectionMethod($func[0], $func[1]);
		$func_name = (is_object($func[0]) ? get_class($func[0]) : $func[0]).'::'.$func[1];
	} else {
		$reflect = new ReflectionFunction($func);
		$func_name = $func;
	}
 
	$args = array();
	foreach ($reflect->getParameters() as $i => $param){
		$pname = $param->getName();
 
		if(isset($array[$pname]) || array_key_exists($pname, $array)){
			$args[$i] = $array[$pname];
		} else if ($param->isDefaultValueAvailable()){
			$args[$i] = $param->getDefaultValue();
		} else{
			trigger_error("call to {$func_name} missing parameter nr. ", $i+1, E_USER_ERROR);
			$args[$i] = null;
		}
	}
 
	return call_user_func_array($func, $args);
}

連想配列と配列を区別する

function is_assoc($array) {
	return array_keys($array) !== range(0, count($array)-1);
}

マルチバイト対応 json_encode

json_encodeはUTF-8のみ対応。
その場合、マルチバイト文字列はu~に変換される。

function mb_json_encode($value) {
	$ret = null;
	if(is_array($value)) {
		if(is_assoc($value)) {
			$ret = array();
			foreach($value as $k=>$v) {
				$ret[] = mb_json_encode($k).':'.mb_json_encode($v);
			}
			$ret = '{'.implode(',', $ret).'}';
		} else {
			$ret = array();
			foreach($value as $v) {
				$ret[] = mb_json_encode($v);
			}
			$ret = '['.implode(',', $ret).']';
		}
	} else if(is_object($value)) {
		$ret = mb_json_encode(get_object_vars($value));
	} else if(is_string($value)) {
		$ret = '"'.str_replace('"', '\\"', $value).'"';
	} else {
		$ret = json_encode($value);
	}
	return $ret;
}

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|