See file /home/wwwroot/core/controller/DooController.php


+ Error on line 239

        return $langcode[0];

<?php
/**
 * DooController class file.
 *
 * @author Leng Sheng Hong <darkredz@gmail.com>
 * @link http://www.doophp.com/
 * @copyright Copyright &copy; 2009 Leng Sheng Hong
 * @license http://www.doophp.com/license
 */

/**
 * Base class of all controller
 *
 * <p>Provides a few shorthand methods to access commonly used component during development. e.g. DooLoader, DooLog, DooSqlMagic.</p>
 *
 * <p>Parameter lists and extension type defined in routes configuration can be accessed through <b>$this->params</b> and <b>$this->extension</b></p>
 *
 * <p>If a client sends PUT request to your controller, you can retrieve the values sent through <b>$this->puts</b></p>
 *
 * <p>GET and POST variables can still be accessed via php $_GET and $_POST. They are not handled/process by Doo framework.</p>
 *
 * <p>Auto routing can be denied from a Controller by setting <b>$autoroute = false</b></p>
 *
 * Therefore, the following class properties & methods is reserved and should not be used in your Controller class.
 * <code>
 * $params
 * $puts
 * $extension
 * $autoroute
 * $vdata
 * $renderMethod
 * init_put_vars()
 * load()
 * language()
 * accept_type()
 * render()
 * renderc()
 * setContentType()
 * is_SSL()
 * view()
 * db()
 * cache()
 * acl()
 * beforeRun()
 * isAjax()
 * renderLayout()
 * clientIP()
 * saveRendered()
 * saveRenderedC()
 * toXML()
 * toJSON()
 * viewRenderAutomation()
 * </code>
 *
 * You still have a lot of freedom to name your methods and properties other than names mentioned.
 *
 * @author Leng Sheng Hong <darkredz@gmail.com>
 * @version $Id: DooController.php 1000 2009-07-7 18:27:22
 * @package doo.controller
 * @since 1.0
 */
class DooController {
    
/**
     * Associative array of the parameter list found matched in a URI route.
     * @var array
     */
    
public $params;

    
/**
     * Associative array of the PUT values sent by client.
     * @var array
     */
    
public $puts;

    
/**
     * Extension name (.html, .json, .xml ,...) found in the URI. Routes can be specified with a string or an array as matching extensions
     * @var string
     */
    
public $extension;

    
/**
     * Deny or allow auto routing access to a Controller. By default auto routes are allowed in a controller.
     * @var bool
     */
    
public $autoroute TRUE;

    
/**
     * Data to be pass from controller to view to be rendered
     * @var mixed
     */
    
public $vdata;

    
/**
     * Enable auto render of view at the end of a controller -> method request
     * @var bool
     */
    
public $autorender FALSE;

    
/**
     * Render method for auto render. You can use 'renderc' & 'render' or your own method in the controller.
     * @var string Default is renderc
     */
    
public $renderMethod 'renderc';

    protected 
$_load;
    protected 
$_view;

    
/**
     * Set PUT request variables in a controller. This method is to be used by the main web app class.
     */
    
public function init_put_vars(){
        
parse_str(file_get_contents('php://input'), $this->puts);
    }

    
/**
     * The loader singleton, auto create if the singleton has not been created yet.
     * @return DooLoader
     */
    
public function load(){
        if(
$this->_load==NULL){
            
Doo::loadCore('uri/DooLoader');
            
$this->_load = new DooLoader;
        }

        return 
$this->_load;
    }

    
/**
     * Returns the database singleton, shorthand to Doo::db()
     * @return DooSqlMagic
     */
    
public function db(){
        return 
Doo::db();
    }

    
/**
     * Returns the Acl singleton, shorthand to Doo::acl()
     * @return DooAcl
     */
    
public function acl(){
        return 
Doo::acl();
    }

    
/**
     * This will be called before the actual action is executed
     */
    
public function beforeRun($resource$action){}

    
/**
     * Returns the cache singleton, shorthand to Doo::cache()
     * @return DooFileCache|DooFrontCache|DooApcCache|DooMemCache|DooXCache|DooEAcceleratorCache
     */
    
public function cache($cacheType='file'){
        return 
Doo::cache($cacheType);
    }

    
/**
     * Writes the generated output produced by render() to file.
     * @param string $path Path to save the generated output.
     * @param string $templatefile Template file name (without extension name)
     * @param array $data Associative array of the data to be used in the Template file. eg. <b>$data['username']</b>, you should use <b>{{username}}</b> in the template.
     * @return string|false The file name of the rendered output saved (html).
     */
    
public function saveRendered($path$templatefile$data=NULL) {
        return 
$this->view()->saveRendered($path$templatefile$data);
    }

    
/**
     * Writes the generated output produced by renderc() to file.
     * @param string $path Path to save the generated output.
     * @param string $templatefile Template file name (without extension name)
     * @param array $data Associative array of the data to be used in the Template file. eg. <b>$data['username']</b>, you should use <b>{{username}}</b> in the template.
     * @param bool $enableControllerAccess Enable the view scripts to access the controller property and methods.
     * @param bool $includeTagClass If true, DooView will determine which Template tag class to include. Else, no files will be loaded
     * @return string|false The file name of the rendered output saved (html).
     */
    
public function saveRenderedC($path$templatefile$data=NULL$enableControllerAccess=False$includeTagClass=True){
        if(
$enableControllerAccess===true){
            return 
$this->view()->saveRenderedC($file$data$this$includeTagClass);
        }else{
            return 
$this->view()->saveRenderedC($file$datanull$includeTagClass);
        }
    }

    
/**
     * The view singleton, auto create if the singleton has not been created yet.
     * @return DooView|DooViewBasic
     */
    
public function view(){
        if(
$this->_view==NULL){
            
$engine Doo::conf()->TEMPLATE_ENGINE;
            
Doo::loadCore('view/' $engine);
            
$this->_view = new $engine;
        }

        return 
$this->_view;
    }

    
/**
     * Short hand for $this->view()->render() Renders the view file.
     *
     * @param string $file Template file name (without extension name)
     * @param array $data Associative array of the data to be used in the Template file. eg. <b>$data['username']</b>, you should use <b>{{username}}</b> in the template.
     * @param bool $process If TRUE, checks the template's last modified time against the compiled version. Regenerates if template is newer.
     * @param bool $forceCompile Ignores last modified time checking and force compile the template everytime it is visited.
     */
    
public function render($file$data=NULL$process=NULL$forceCompile=false){
        
$this->view()->render($file$data$process$forceCompile);
    }

    
/**
     * Short hand for $this->view()->renderc() Renders the view file(php) located in viewc.
     *
     * @param string $file Template file name (without extension name)
     * @param array $data Associative array of the data to be used in the php template.
     * @param bool $enableControllerAccess Enable the view scripts to access the controller property and methods.
     * @param bool $includeTagClass If true, DooView will determine which Template tag class to include. Else, no files will be loaded
     */
    
public function renderc($file$data=NULL$enableControllerAccess=False$includeTagClass=True){
        if(
$enableControllerAccess===true){
            
$this->view()->renderc($file$data$this$includeTagClass);
        }else{
            
$this->view()->renderc($file$datanull$includeTagClass);
        }
    }

    
/**
     * Get the client accept language from the header
     *
     * @param bool $countryCode to return the language code along with country code
     * @return string The language code. eg. <b>en</b> or <b>en-US</b>
     */
    
public function language($countryCode=FALSE){
        
$langcode = (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
        
$langcode = (!empty($langcode)) ? explode(';'$langcode) : $langcode;
        
$langcode = (!empty($langcode[0])) ? explode(','$langcode[0]) : $langcode;
        if(!
$countryCode)
            
$langcode = (!empty($langcode[0])) ? explode('-'$langcode[0]) : $langcode;
        return $langcode[0];

    }

    
/**
     * Get the client specified accept type from the header sent
     *
     * <p>Instead of appending a extension name like '.json' to a URL,
     * clients can use 'Accept: application/json' for RESTful APIs.</p>
     * @return string Client accept type
     */
    
public function accept_type(){
        
$type = array(
            
'*/*'=>'*',
            
'html'=>'text/html,application/xhtml+xml',
            
'xml'=>'application/xml,text/xml,application/x-xml',
            
'json'=>'application/json,text/x-json,application/jsonrequest,text/json',
            
'js'=>'text/javascript,application/javascript,application/x-javascript',
            
'css'=>'text/css',
            
'rss'=>'application/rss+xml',
            
'yaml'=>'application/x-yaml,text/yaml',
            
'atom'=>'application/atom+xml',
            
'pdf'=>'application/pdf',
            
'text'=>'text/plain',
            
'png'=>'image/png',
            
'jpg'=>'image/jpg,image/jpeg,image/pjpeg',
            
'gif'=>'image/gif',
            
'form'=>'multipart/form-data',
            
'url-form'=>'application/x-www-form-urlencoded',
            
'csv'=>'text/csv'
        
);

        
$matches = array();

        
//search and match, add 1 priority to the key if found matched
        
foreach($type as $k=>$v){
            if(
strpos($v,',')!==FALSE){
                
$tv explode(','$v);
                foreach(
$tv as $k2=>$v2){
                    if (
stristr($_SERVER["HTTP_ACCEPT"], $v2)){
                        if(isset(
$matches[$k]))
                            
$matches[$k] = $matches[$k]+1;
                        else
                            
$matches[$k]=1;
                    }
                }
            }else{
                if (
stristr($_SERVER["HTTP_ACCEPT"], $v)){
                    if(isset(
$matches[$k]))
                        
$matches[$k] = $matches[$k]+1;
                    else
                        
$matches[$k]=1;
                }
            }
        }

        if(
sizeof($matches)<1)
            return 
NULL;

        
//sort by the highest priority, keep the key, return the highest
        
arsort($matches);

        foreach (
$matches as $k=>$v){
            return (
$k==='*/*')?'html':$k;
        }
    }

    
/**
     * Sent a content type header
     *
     * <p>This can be used with your REST api if you allow clients to retrieve result format
     * by sending a <b>Accept type header</b> in their requests. Alternatively, extension names can be
     * used at the end of an URI such as <b>.json</b> and <b>.xml</b></p>
     *
     * <p>NOTE: This method should be used before echoing out your results.
     * Use accept_type() or $extension to determined the desirable format the client wanted to accept.</p>
     *
     * @param string $type Content type of the result. eg. text, xml, json, rss, atom
     * @param string $charset Charset of the result content. Default utf-8.
     */
    
public function setContentType($type$charset='utf-8'){
        if(
headers_sent())return;

        
$extensions = array('html'=>'text/html',
                            
'xml'=>'application/xml',
                            
'json'=>'application/json',
                            
'js'=>'application/javascript',
                            
'css'=>'text/css',
                            
'rss'=>'application/rss+xml',
                            
'yaml'=>'text/yaml',
                            
'atom'=>'application/atom+xml',
                            
'pdf'=>'application/pdf',
                            
'text'=>'text/plain',
                            
'png'=>'image/png',
                            
'jpg'=>'image/jpeg',
                            
'gif'=>'image/gif',
                            
'csv'=>'text/csv'
                        
);
        if(isset(
$extensions[$type]))
            
header("Content-Type: {$extensions[$type]}; charset=$charset");
    }

    
/**
     * Get client's IP
     * @return string
     */
    
public function clientIP(){
        if(
getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
            return 
getenv('HTTP_CLIENT_IP');
        } elseif(
getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
            return 
getenv('HTTP_X_FORWARDED_FOR');
        } elseif(
getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
            return 
getenv('REMOTE_ADDR');
        } elseif(isset(
$_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
            return 
$_SERVER['REMOTE_ADDR'];
        }
    }

    public function 
__destruct() {
        if(
$this->autorender===true){
            
$this->viewRenderAutomation();
        }
    }

    protected function 
viewRenderAutomation(){
        if(
is_string(Doo::conf()->AUTO_VIEW_RENDER_PATH)){
            
$path Doo::conf()->AUTO_VIEW_RENDER_PATH;
            
$path str_replace(':''@'substr($path1));
            
//echo $path;
            
$this->{$this->renderMethod}($path$this->vdata);
        }else{
            
//echo '<br>'.strtolower(Doo::conf()->AUTO_VIEW_RENDER_PATH[0]) .'/'. strtolower(Doo::conf()->AUTO_VIEW_RENDER_PATH[1]);
            
$this->{$this->renderMethod}(strtolower(Doo::conf()->AUTO_VIEW_RENDER_PATH[0]) .'/'strtolower(Doo::conf()->AUTO_VIEW_RENDER_PATH[1]), $this->vdata);
        }
    }

    
/**
     * Check if the request is an AJAX request usually sent with JS library such as JQuery/YUI/MooTools
     * @return bool
     */
    
public function isAjax(){
        return (isset(
$_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
    }

    
/**
     * Check if the connection is a SSL connection
     * @return bool determined if it is a SSL connection
     */
    
public function is_SSL(){
        if(!isset(
$_SERVER['HTTPS']))
            return 
FALSE;

        
//Apache
        
if($_SERVER['HTTPS'] === 1) {
            return 
TRUE;
        }
        
//IIS
        
elseif ($_SERVER['HTTPS'] === 'on') {
            return 
TRUE;
        }
        
//other servers
        
elseif ($_SERVER['SERVER_PORT'] == 443){
            return 
TRUE;
        }
        return 
FALSE;
    }

    
/**
     * Convert DB result into XML string for RESTful api.
     * <code>
     * public function listUser(){
     *     $user = new User;
     *     $rs = $user->find();
     *     $this->toXML($rs, true);
     * }
     * </code>
     * @param mixed $result Result of a DB query. eg. $user->find();
     * @param bool $output Output the result automatically.
     * @param bool $setXMLContentType Set content type.
     * @param string $encoding Encoding of the result content. Default utf-8.
     * @return string XML string
     */
    
public function toXML($result$output=false$setXMLContentType=false$encoding='utf-8'){
        
$str '<?xml version="1.0" encoding="utf-8"?><result>';
        foreach(
$result as $kk=>$vv){
            
$cls get_class($vv);
            
$str .= '<' $cls '>';
            foreach(
$vv as $k=>$v){
                if(
$k!='_table' && $k!='_fields' && $k!='_primarykey'){
                    if(
is_array($v)){
                        
//print_r($v);
                        //exit;
                        
$str .= '<' $k '>';
                        foreach(
$v as $v0){
                            
$str .= '<data>';
                            foreach(
$v0 as $k1=>$v1){
                                if(
$k1!='_table' && $k1!='_fields' && $k1!='_primarykey'){
                                    if(
is_array($v1)){
                                        
$str .= '<' $k1 '>';
                                        foreach(
$v1 as $v2){
                                            
$str .= '<data>';
                                            foreach(
$v2 as $k3=>$v3){
                                                if(
$k3!='_table' && $k3!='_fields' && $k3!='_primarykey'){
                                                    
$str .= '<'$k3 '><![CDATA[' $v3 ']]></'$k3 '>';
                                                }
                                            }
                                            
$str .= '</data>';
                                        }
                                        
$str .= '</' $k1 '>';
                                    }else{
                                        
$str .= '<'$k1 '><![CDATA[' $v1 ']]></'$k1 '>';
                                    }
                                }
                            }
                            
$str .= '</data>';
                        }
                        
$str .= '</' $k '>';

                    }else{
                        
$str .= '<'$k '>' $v '</'$k '>';
                    }
                }
            }
            
$str .= '</' $cls '>';
        }
        
$str .= '</result>';
        if(
$setXMLContentType===true)
            
$this->setContentType('xml'$encoding);
        if(
$output===true)
            echo 
$str;
        return 
$str;
    }

    
/**
     * Convert DB result into JSON string for RESTful api.
     * <code>
     * public function listUser(){
     *     $user = new User;
     *     $rs = $user->find();
     *     $this->toJSON($rs, true);
     * }
     * </code>
     * @param mixed $result Result of a DB query. eg. $user->find();
     * @param bool $output Output the result automatically.
     * @param bool $removeNullField Remove fields with null value from JSON string.
     * @param array $exceptField Remove fields that are null except the ones in this list.
     * @param array $mustRemoveFieldList Remove fields in this list.
     * @param bool $setJSONContentType Set content type.
     * @param string $encoding Encoding of the result content. Default utf-8.
     * @return string JSON string
     */
    
public function toJSON($result$output=false$removeNullField=false$exceptField=null$mustRemoveFieldList=null$setJSONContentType=true$encoding='utf-8'){
        
$rs preg_replace(array('/\,\"\_table\"\:\".*\"/U''/\,\"\_primarykey\"\:\".*\"/U''/\,\"\_fields\"\:\[\".*\"\]/U'), ''json_encode($result));
        if(
$removeNullField){
            if(
$exceptField===null)
                
$rs preg_replace(array('/\,\"[^\"]+\"\:null/U''/\{\"[^\"]+\"\:null\,/U'), array('','{'), $rs);
            else{
                
$funca1 =  create_function('$matches',
                            
'if(in_array($matches[1], array(\''. implode("','",$exceptField) .'\'))===false){
                                return "";
                            }
                            return $matches[0];'
);

                
$funca2 =  create_function('$matches',
                            
'if(in_array($matches[1], array(\''. implode("','",$exceptField) .'\'))===false){
                                return "{";
                            }
                            return $matches[0];'
);

                
$rs preg_replace_callback('/\,\"([^\"]+)\"\:null/U'$funca1$rs);
                
$rs preg_replace_callback('/\{\"([^\"]+)\"\:null\,/U'$funca2$rs);
            }
        }

        
//remove fields in this array
        
if($mustRemoveFieldList!==null){
            
$funcb1 =  create_function('$matches',
                        
'if(in_array($matches[1], array(\''. implode("','",$mustRemoveFieldList) .'\'))){
                            return "";
                        }
                        return $matches[0];'
);

            
$funcb2 =  create_function('$matches',
                        
'if(in_array($matches[1], array(\''. implode("','",$mustRemoveFieldList) .'\'))){
                            return "{";
                        }
                        return $matches[0];'
);

            
$rs preg_replace_callback(array('/\,\"([^\"]+)\"\:\".*\"/U''/\,\"([^\"]+)\"\:\{.*\}/U'), $funcb1$rs);

            
$rs preg_replace_callback(array('/\{\"([^\"]+)\"\:\".*\"\,/U','/\{\"([^\"]+)\"\:\{.*\}\,/U'), $funcb2$rs);
        }

        
//$rs = str_replace(array('[,',',,'), array('[{',',{'), $rs);

        
if($output===true){
            if(
$setJSONContentType===true)
                
$this->setContentType('json'$encoding);
            echo 
$rs;
        }
        return 
$rs;
    }

    public function  
__call($name,  $arguments) {
        if (
$name == 'renderLayout') {
            throw new 
Exception('renderLayout is no longer supported by DooController. Please use $this->view()->renderLayout instead');
        } else {
            if (
function_exists('get_called_class')) {
                
$err get_called_class() . ": Tried to call unknown method: {$name}";
            } else {
                
$err "DooController: Someone tried to call unknown method: {$name}";
            }

            if (!empty (
$arguments)) {
                
$err .= '\n\t called with arguments: ' implode(', '$arguments);
            }
            
Doo::logger()->err($err);
        }
    }

}


* Stack Trace...

  1. /home/wwwroot/cellon/index.php(38) calling run()
  2. /home/wwwroot/core/app/DooWebApp.php(34) calling route_to()
  3. /home/wwwroot/core/app/DooWebApp.php(74) calling __construct()
  4. /home/wwwroot/cellon/protected/controller/CoreController.php(75) calling getLang()
  5. /home/wwwroot/cellon/protected/controller/CoreController.php(157) calling language()


* Variables...  Conf .  GET  .  POST  .  Session  .  Cookie 


object(DooConfig)#1 (35) {
  
["SITE_PATH"] => string(21"/home/wwwroot/cellon/"
  
["PROTECTED_FOLDER"] => string(10"protected/"
  
["BASE_PATH"] => string(19"/home/wwwroot/core/"
  
["LOG_PATH"] => string(10"/var/logs/"
  
["APP_URL"] => string(22"http://www.cellon.com/"
  
["SUBFOLDER"] => string(1"/"
  
["APP_MODE"] => string(4"prod"
  
["AUTOROUTE"] => bool(false)
  [
"DEBUG_ENABLED"] => bool(false)
  [
"ERROR_404_DOCUMENT"] => NULL
  
["ERROR_404_ROUTE"] => string(6"/error"
  
["CACHE_PATH"] => NULL
  
["AUTO_VIEW_RENDER_PATH"] => NULL
  
["MEMCACHE"] => NULL
  
["TEMPLATE_ENGINE"] => string(7"DooView"
  
["TEMPLATE_SHOW_COMMENT"] => NULL
  
["TEMPLATE_ALLOW_PHP"] => NULL
  
["TEMPLATE_COMPILE_ALWAYS"] => NULL
  
["TEMPLATE_GLOBAL_TAGS"] => array(6) {
    [
0] =>   string(5"isset"
    
[1] =>   string(5"empty"
    
[2] =>   string(8"is_array"
    
[3] =>   string(8"in_array"
    
[4] =>   string(5"count"
    
[5] =>   string(10"strip_tags"
  
}
  [
"MODEL_PATH"] => string(37"/home/wwwroot/cellon/protected/model/"
  
["START_TIME"] => float(1481099533.2956)
  [
"ROOT_DIR"] => string(21"/home/wwwroot/cellon/"
  
["APP_NAMESPACE"] => string(6"cellon"
  
["MENU_TYPES"] => array(4) {
    [
0] =>   string(8"mainmenu"
    
[1] =>   string(9"adminmenu"
    
[2] =>   string(8"usermenu"
    
[3] =>   string(7"sitemap"
  
}
  [
"CACHE_ENABLE"] => bool(false)
  [
"LANGUAGES"] => array(2) {
    [
"en"] =>   string(7"English"
    
["zh"] =>   string(12"简体中文"
  
}
  [
"PERPAGE"] => int(5)
  [
"PAGE_TYPES"] => array(2) {
    [
0] =>   string(4"page"
    
[1] =>   string(8"category"
  
}
  [
"MODULES"] => array(2) {
    [
0] =>   string(7"product"
    
[1] =>   string(6"career"
  
}
  [
"resumeStat"] => array(6) {
    [
"unview"] =>   string(9"未处理"
    
["informed"] =>   string(9"已通知"
    
["interviewed"] =>   string(9"已面试"
    
["rejected"] =>   string(9"已拒绝"
    
["approved"] =>   string(9"已录用"
    
["reserved"] =>   string(9"已保留"
  
}
  [
"countries"] => array(3) {
    [
0] =>   string(5"china"
    
[1] =>   string(5"korea"
    
[2] =>   string(3"usa"
  
}
  [
"theme"] => string(11"cellon_2012"
  
["filetypes"] => array(6) {
    [
"image"] =>   array(5) {
      [
0] =>     string(3"jpg"
      
[1] =>     string(4"jpeg"
      
[2] =>     string(3"png"
      
[3] =>     string(3"bmp"
      
[4] =>     string(3"gif"
    
}
    [
"doc"] =>   array(8) {
      [
0] =>     string(3"doc"
      
[1] =>     string(4"docx"
      
[2] =>     string(3"ppt"
      
[3] =>     string(4"pptx"
      
[4] =>     string(3"xls"
      
[5] =>     string(4"xlsx"
      
[6] =>     string(3"pdf"
      
[7] =>     string(3"txt"
    
}
    [
"file"] =>   array(2) {
      [
0] =>     string(3"zip"
      
[1] =>     string(3"rar"
    
}
    [
"swf"] =>   array(1) {
      [
0] =>     string(3"swf"
    
}
    [
"audio"] =>   array(3) {
      [
0] =>     string(4"midi"
      
[1] =>     string(3"wav"
      
[2] =>     string(3"mp3"
    
}
    [
"video"] =>   array(5) {
      [
0] =>     string(3"wmv"
      
[1] =>     string(3"avi"
      
[2] =>     string(2"rm"
      
[3] =>     string(4"rmvb"
      
[4] =>     string(3"mp4"
    
}
  }
  [
"FEATURES"] => array(8) {
    [
"form"] =>   array(7) {
      [
0] =>     string(3"Bar"
      
[1] =>     string(9"clamshell"
      
[2] =>     string(5"slide"
      
[3] =>     string(6"swivel"
      
[4] =>     string(6"qwerty"
      
[5] =>     string(10"full-touch"
      
[6] =>     string(6"tablet"
    
}
    [
"resolution"] =>   array(7) {
      [
0] =>     string(4"QCIF"
      
[1] =>     string(5"QCIF+"
      
[2] =>     string(4"QVGA"
      
[3] =>     string(5"WQVGA"
      
[4] =>     string(4"HVGA"
      
[5] =>     string(3"VGA"
      
[6] =>     string(4"WVGA"
    
}
    [
"generation"] =>   array(2) {
      [
0] =>     string(2"2G"
      
[1] =>     string(2"3G"
    
}
    [
"technology"] =>   array(3) {
      [
0] =>     string(3"GSM"
      
[1] =>     string(4"UMTS"
      
[2] =>     string(4"EVDO"
    
}
    [
"bands"] =>   array(5) {
      [
0] =>     string(3"850"
      
[1] =>     string(3"900"
      
[2] =>     string(4"1800"
      
[3] =>     string(4"1900"
      
[4] =>     string(4"2100"
    
}
    [
"os"] =>   array(3) {
      [
0] =>     string(7"feature"
      
[1] =>     string(7"android"
      
[2] =>     string(5"linux"
    
}
    [
"display"] =>   array(2) {
      [
0] =>     string(4"OLED"
      
[1] =>     string(3"TFT"
    
}
    [
"other"] =>   array(20) {
      [
0] =>     string(8"DUAL-SIM"
      
[1] =>     string(6"QWERTY"
      
[2] =>     string(12"TOUCH-SCREEN"
      
[3] =>     string(6"CAMERA"
      
[4] =>     string(12"CAMERA-FLASH"
      
[5] =>     string(15"VIEDEO-RECORDER"
      
[6] =>     string(16"SECONDARY-CAMERA"
      
[7] =>     string(15"MEMORYCARD-SLOT"
      
[8] =>     string(3"GPS"
      
[9] =>     string(4"WLAN"
      
[10] =>     string(3"NFC"
      
[11] =>     string(4"EDGE"
      
[12] =>     string(4"GPRS"
      
[13] =>     string(9"Bluetooth"
      
[14] =>     string(12"EMAIL-CLIENT"
      
[15] =>     string(3"WAP"
      
[16] =>     string(4"JAVA"
      
[17] =>     string(5"RADIO"
      
[18] =>     string(3"MMS"
      
[19] =>     string(6"RUGGED"
    
}
  }
  [
"SITECLOSED"] => int(0)
}
$_COOKIE Variables array(0) {
}

BACK TO TOP