首页 > 编程技术 > php

php数组编码的转换方式的例子

发布时间:2016-11-25 15:32

数组编码会不会有区别可不可以进行转换呢,今天小编来为各位介绍一篇关于php数组编码的转换方式的例子,希望下文能够对各位有用。

第一种方式

$data = eval(‘return ‘.iconv(‘gbk’,’utf-8′,var_export($data,true)).';’);
在这里var_export函数可以输出或返回一个变量的字符串表示。此函数返回关于传递给该函数的变量的结构信息,它和 var_dump()
类似,不同的是其返回的表示是合法的 PHP 代码。
可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
下面就利用这一特性将数组转化为字符串然后再iconv接着再用eval函数将其还原为数组。这次结果正确显示了。

第二种方式

< ?php
class arrayiconv
{
static protected $in;
static protected $out;
/**
* 静态方法,该方法输入数组并返回数组
*
* @param unknown_type $array 输入的数组
* @param unknown_type $in 输入数组的编码
* @param unknown_type $out 返回数组的编码
* @return unknown 返回的数组
*/
static public function Conversion($array,$in,$out)
{
self::$in=$in;
self::$out=$out;
return self::arraymyicov($array);
}
/**
* 内部方法,循环数组
*
* @param unknown_type $array
* @return unknown
*/
static private function arraymyicov($array)
{
foreach ($array as $key=>$value)
{
$key=self::myiconv($key);
if (!is_array($value)) {
$value=self::myiconv($value);
}else {
$value=self::arraymyicov($value);
}
$temparray[$key]=$value;
}
return $temparray;
}
/**
* 替换数组编码
*
* @param unknown_type $str
* @return unknown
*/
static private function myiconv($str)
{
return iconv(self::$in,self::$out,$str);
}
}
$b=array(“测试”=>array(“测试”=>”测试”,”测试”=>”测试”,”测试”=>array(“测试”=>”测试”)),”fasdf”=>”测试”,”测试”=>”测试 “);
$a =arrayiconv::Conversion($b,”utf-8″,”gb2312″);
print_r($a);
?>

php error_log 错误信息如果要做日志分析我们是需要生成日志文件保存到数据库中或文件中了,我们这里以写文件为例子,下面一起来看看

开发的时候,基本上都会把display_errors,error_reporting开启,有助于提高开发效率,上线后,基本上都会关掉页面报错信息,在把报错信息,放到文件中。

一,php-fpm的error_log配置

1,修改php.ini

display_errors = Off    //改为off,页面访问时就不会出现报错信息了 

2,修改php-fpm配置文件

;php_flag[display_errors] = off 
php_admin_value[error_log] = /var/log/php-fpm/www-error.log 
php_admin_flag[log_errors] = on
 
重启php-fpm,在这里要注意,php-fpm的配置会替换php.ini中的配置,display_errors也可以在php-fpm中配置。这样页面上就不会出现报错信息,报错信息被记录到了文件中。

二,命令行下的error_log配置,修改php.ini

display_errors = Off 
log_errors = On 
error_log = /var/log/cron/error.log 

执行命令,例如:

[root@network www]# php test.php    //test.php有语法错误 

命令行下,是不调用php-fpm的配置的,所以我们只能修改php.ini的内容,修改后,不用重启php。执行命令后,错误信息,会被写到error.log文件中,这种情况适合crontab的php脚本。

json_encode 对英文及uft8编码一般不会有什么问题了,但是如果是gkb或中文时就会碰到一些问题了,今天我们就一起来看一篇关于json_encode 函数中文被编码成 null的问题的解决办法

json格式在开发中用的十分广泛。在php中json_encode函数可以直接将数组转成 json格式,十分方便。但是有可能你在使用json_encode函数时,无奈的发现中文被编码成null了。原来json只支持转义utf-8编码格式的中文。php数组使用json_encode函数中文被编码成null的原因是转义gbk 或者别的编码时,中文被忽略了。一般出现在文档编码或者输出的内容编码是非UTF-8时,也就是说,GBK或者GB2312的中文,就会出现编码失败的现象。
php数组使用json_encode函数中文被编码成null的原因和解决办法,如果你的程序是采用utf-8编码,请确保文件保存为utf-8 无bom格式,如果你的程序是gbk的,可以先转成utf-8编码后在使用json_encode函数

在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式,但是转换后的中文会变成Unicode编码。

<?php
$arr = array
(
‘Name’=>’希亚’,
‘Age’=>20
);

$jsonencode = json_encode($arr);
echo $jsonencode;
?>
程序运行结果如下:

{“Name”:null,”Age”:20}
json_encode 函数中中文被编码成 null 了,Google 了一下,很简单,为了与前端紧密结合,Json 只支持 utf-8 编码,我认为是前端的 Javascript 也是 utf-8 的原因。

<?php
$array = array
(
‘title’=>iconv(‘gb2312′,’utf-8′,’这里是中文标题’),
‘body’=>’abcd…’
);

echo json_encode($array);
?>
这个程序的运行结果为:

{“title”:”\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898″,”body”:”abcd…”}
数 组中所有中文在json_encode之后都不见了或者出现\u2353等。解决方法是用urlencode()函数处理以下,在json_encode 之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode() 将编码过的中文转回来。

<?php
/**************************************************************
*
* 使用特定function对数组中所有元素做处理
* @param string &$array 要处理的字符串
* @param string $function 要执行的函数
* @return boolean $apply_to_keys_also 是否也应用到key上
* @access public
*
*************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die(‘possible deep recursion attack’);
}
foreach ($array as $key => $value) {
if (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}

if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter–;
}

/**************************************************************
*
* 将数组转换为JSON字符串(兼容中文)
* @param array $array 要转换的数组
* @return string 转换得到的json字符串
* @access public
*
*************************************************************/
function JSON($array) {
arrayRecursive($array, ‘urlencode’, true);
$json = json_encode($array);
return urldecode($json);
}

$array = array
(
‘Name’=>’希亚’,
‘Age’=>20
);

echo JSON($array);
?>
这次成功了,运行结果如下:

{“Name”:”希亚”,”Age”:”20″}

Class not found提示是类没有找到了,没有找到对应的类我们可以检查是不是哪里配置或调用有问题了,下面我们来看一篇关于Laravel执行migrate操作提示”Class not found”问题解决办法了,具体的如下所示。

使用Laravel的artisan命令工具执行migrate操作,提示”Class not found”的错误,但是这个migrate类文件是存在的,如遇到这个问题,可执行以下composer dump-autoload,问题得到解决。

一开始报错如下:


[root@iZ94r80gdghZ tanteng.me]# php artisan migrate:reset
                                                          
[Symfony\Component\Debug\Exception\FatalThrowableError] 
Fatal error: Class 'CreateAttachmentTable' not found

无论执行migrate什么操作都提示类找不到。

执行composer dump-autoload后,再次运行migrate操作,一切正常。

[root@iZ94r80gdghZ tanteng.me]# composer dump-autoload
Generating autoload files
[root@iZ94r80gdghZ tanteng.me]# php artisan migrate:reset
Rolled back: 2016_03_30_104849_create_attachment_table
Rolled back: 2016_03_07_094057_create_admins_table
Rolled back: 2016_02_22_102354_entrust_setup_tables
Rolled back: 2016_02_22_091444_my_ask_anwser_table
Rolled back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_000000_create_users_table
composer dump-autoload的作用

composer dump-autoload命令的作用是优化自动加载,当把代码部署到生产环境中,或者增加删除了自动加载文件夹里的类文件,需要执行一下自动加载命令,这样自动加载才会起作用。

标签:[!--infotagslink--]

您可能感兴趣的文章: