xFacility/Codes2010. 6. 8. 19:57
API 4.0에 쓰이는 그릇Container처리 함수입니다.
고민을 나누면 코드를 더 효율적으로 변경할 수 있을 것 같아서 올립니다.

function container($container) {
/*
DEVELOPMENT:
Michael Son(michaelson@nate.com)
08.Jun.2010.
DESCRIPTION:
Parse Container to Array
CALL:
container("{a{c{e{10;1;}e=6;}d{g=7;}c{e{5}}}b{e=5;}}");
RETURN:
$result[a][c][e][0] = 10;
$result[a][c][e][1] = 1;
$result[a][c][e][2] = 6;
$result[a][c][e][3] = 5;
$result[a][c][b][e] = 5;
$result[a][d][g] = 7;
*/
if(is_container($container)) {
$container = trim($container);
$leng = strlen($container);
$opens = substr_count($container, "{");
$equals = substr_count($container, "=");
$divides = substr_count($container, ";");
$closes = substr_count($container, "}");
$loop = $opens+$equals+$divides+$closes;
if($loop == 0) {
$return = $container;
} else if(substr_count($container, "{")==substr_count($container, "}")) {
$last_char = substr($container, $leng-1, 1);
if($last_char=="{"||$last_char=="=") {
$container .= substr($container, 0, strlen($container)-1);
} else if($last_char!=";"&&$last_char!="}") {
$container = "{".$container."}";
}
$open = find_chars($container, "{");
$equal = find_chars($container, "=");
$divide = find_chars($container, ";");
$close = find_chars($container, "}");
$j=0;$k=0;$l=0;$m=0;$counter=0;
for($i=0; $i<$loop; $i++) {
if($open[$j]==NULL&&$open[$j]!="0")
$open[$j]=$leng-1;
if($equal[$k]==NULL&&$equal[$j]!="0")
$equal[$k]=$leng-1;
if($divide[$l]==NULL&&$divide[$j]!="0")
$divide[$l]=$leng-1;
if($close[$m]==NULL&&$close[$j]!="0")
$close[$m]=$leng-1;
$breaker[$i] = min($open[$j], $equal[$k], $divide[$l], $close[$m]);
$last_char = substr($container, $breaker[$i-1], 1);
$now_char = substr($container, $breaker[$i], 1); 
$length = $breaker[$i];
if($i!=0)
$length -= $breaker[$i-1]+1;
switch ($now_char) {
case "{":
if($last_char!="="&&$length>0) {
$address_now .= "{".trim(substr($container, $breaker[$i-1]+1, $length));
if($auto[$address_now]==NULL&&$auto[$address_now]!="0") {
$auto[$address_now] = 0;
}
}
$j++;
break;
case "=":
if($last_char!="="&&$length>0) {
$address_now .= "{".trim(substr($container, $breaker[$i-1]+1, $length));
}
$k++;
break;
case ";":
if($length>0) {
$value[$counter] = trim(substr($container, $breaker[$i-1]+1, $length));
if($last_char!="=")
$address_now .= "{".$auto[$address_now];
$address[$counter] = $address_now;
$address_now = drop_atlastchar($address_now, "{");
if($last_char!="=")
$auto[$address_now]++;
$counter++;
}
$l++;
break;
case "}":
if($i!=0&&$length>0) {
$value[$counter] = trim(substr($container, $breaker[$i-1]+1, $length));
if($last_char!="=")
$address_now .= "{".$auto[$address_now];
$address[$counter] = $address_now;
$address_now = drop_atlastchar($address_now, "{");
$address_now = drop_atlastchar($address_now, "{");
if($last_char!="=")
$auto[$address_now]++;
$counter++;
} else if($length==0&&$last_char==";") {
$address_now = drop_atlastchar($address_now, "{");
}
$m++;
break;
}
}
}
}
//upsidedown
for($i=0; $i<$counter; $i++) {
$value_tmp[$counter-$i-1] = $value[$i];
$address_tmp[$counter-$i-1] = $address[$i];
}
unset($value, $address);
$value = $value_tmp;
$address = $address_tmp;
for($i=0; $i<=$counter; $i++) {
$loop = substr_count($address[$i], "{");
for($j=0; $j<$loop; $j++) {
$name = drop_atlastchar($address[$i], "{", false);
$temp[$name] = $value[$i];
unset($value[$i]);
$value[$i] = $temp;
unset($temp);
$address[$i] = drop_atlastchar($address[$i], "{");
}
$return = array_merge_recursive($value[$i], $return);
}
return $return;
}

'xFacility > Codes' 카테고리의 다른 글

xFacility^PHP > Internal API 3.0  (0) 2010.06.08
xFacility^PHP > Internal API 2.0  (0) 2010.05.17
xFacility^PHP > Internal API 1.0  (0) 2010.05.17
Posted by 마이클