Skip to content

Instantly share code, notes, and snippets.

@wgkoro
Created October 10, 2012 16:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wgkoro/3866770 to your computer and use it in GitHub Desktop.
Save wgkoro/3866770 to your computer and use it in GitHub Desktop.
URLのパラメーター文字列を分解・比較するためのクラス
<?php
/**
Author : wg_koro
LastUpdate : 2012/10/11
License : MIT
URLのパラメーター文字列を分解・比較するためのクラス
使い方:
$p = new UrlParam();
$param = 'param1=aa&param2=bb&param3=cc';
var_dump($p->getHash($param));
-> array(3) {
["param1"]=>
string(2) "aa"
["param2"]=>
string(2) "bb"
["param3"]=>
string(2) "cc"
}
// 同じパラメーター名が複数ある場合、値はカンマで連結して格納
$same_param_name = 'param[]=aa&param[]=bb&param2=cc';
var_dump($p->getHash($same_param_name));
-> array(2) {
["param[]"]=>
string(5) "aa,bb"
["param2"]=>
string(2) "cc"
}
$param = 'param1=aa&param2=bb&param3=cc';
$same_param = 'param1=aa&param2=bb&param3=cc';
var_dump($p->isSame($param, $same_param));
-> true
$param = 'param1=aa&param2=bb&param3=cc';
$different = 'param1=a&param2=bb&param3=cc';
var_dump($p->isSame($param, $different));
-> false
// パラメーターの順番が違うだけなら同一とする
$param = 'param1=aa&param2=bb&param3=cc';
$change_order = 'param2=bb&param3=cc&param1=aa';
var_dump($p->isSame($param, $change_order));
-> true
*/
class UrlParam
{
/**
* パラメーター文字列を連想配列形式にして返す
*
* @param <String> $query_str パラメーター文字列 (ex.param1=aa&param2=bb)
* @return <Void>
*/
public function getHash($param_str){
$param = array();
if(! empty($param_str)){
$param = $this->breakDown($param_str);
}
return $param;
}
/**
* 渡された2つのパラメーター文字列を比較する
* パラメーターの順序が入れ替わっている場合でも、同一パラメーターと判定する。
*
* @param <String> $param1 比較元のパラメーター文字列
* @param <String> $param2 比較対象のパラメーター文字列
* @return <Bool> true:同一パラメーター, false:異なるパラメーター
*/
public function isSame($param1, $param2){
$hash1 = array();
$hash2 = array();
if(! empty($param1)){
$hash1 = $this->breakDown($param1);
}
if(! empty($param2)){
$hash2 = $this->breakDown($param2);
}
if($hash1 == $hash2){
return true;
}
return false;
}
/**
* パラメーター文字列を連想配列形式にして返す
* 同一パラメーター名が複数存在する場合は、カンマで値を連結する。 (PHPのparam[]=a&param[]=bといった文字列)
* param1=aa&param2 のような、不自然なパラメーター文字列の場合はtrigger_error()を実行
*
* @param <String> $param_str パラメーター文字列
* @return <Hash> 連想配列
*/
private function breakDown($param_str){
$param_hash = array();
$each_param = explode('&', $param_str);
foreach($each_param as $param){
$param_arr = explode('=', $param);
if(count($param_arr) < 2){
// aaa=111&bbb のような、パラメーター文字列として不自然な場合はfalseを返す
trigger_error("Invalid param strings!", E_USER_ERROR);
}
if(empty($param_hash[$param_arr[0]])){
$param_hash[$param_arr[0]] = $param_arr[1];
}
else{
$param_hash[$param_arr[0]] .= ','.$param_arr[1];
}
}
return $param_hash;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment