PHP对象(object) 与 数组(array) 的转换例子

 更新时间:2016年11月25日 15:32  点击:2487
PHP对象(object) 与 数组(array) 的转换我们开发中用到的非常的多了,对于这个问题我们今天整理一些例子,具体的如下所示。

数组是PHP的灵魂,非常强大,但有时候面向对象编程也是挺方便的,数组 与 对象 之间切换也是常有的事:

例子一

 代码如下 复制代码

/**
 * 数组 转 对象
 *
 * @param array $arr 数组
 * @return object
 */
function array_to_object($arr)
{
 if (gettype($arr) != 'array')
 {
  return;
 }
 foreach ($arr as $k => $v)
 {
  if (gettype($v) == 'array' || getType($v) == 'object')
  {
   $arr[$k] = (object)array_to_object($v);
  }
 }

 return (object)$arr;
}

/**
 * 对象 转 数组
 *
 * @param object $obj 对象
 * @return array
 */
function object_to_array($obj)
{
 $obj = (array)$obj;
 foreach ($obj as $k => $v)
 {
  if (gettype($v) == 'resource')
  {
   return;
  }
  if (gettype($v) == 'object' || gettype($v) == 'array')
  {
   $obj[$k] = (array)object_to_array($v);
  }
 }

 return $obj;
}

例子2

 代码如下 复制代码

<?php

class Test{
    public $a;
    public $b;
    public function __construct($a) {
        $this->a = $a;
    }
}
 
//对象转数组,使用get_object_vars返回对象属性组成的数组
function objectToArray($obj){
    $arr = is_object($obj) ? get_object_vars($obj) : $obj;
    if(is_array($arr)){
        return array_map(__FUNCTION__, $arr);
    }else{
        return $arr;
    }
}
 
//数组转对象
function arrayToObject($arr){
    if(is_array($arr)){
        return (object) array_map(__FUNCTION__, $arr);
    }else{
        return $arr;
    }
}
 
$test = new Test('test1');
$test->b = new Test('test2');
 
print_r($test);
$array = objectToArray($test);
print_r($array);
$object = arrayToObject($array);
print_r($object);

PHP字符变量有时使用时没有按我们想法执行了,对于这个问题小编来为各位整理一篇教程,下面来看PHP字符变量奇怪现象的解释吧,具体如下。

首先神奇的PHP是支持字符数据类型的,有同学就写了这样一段代码:

for ($c = 'a'; $c <= 'z'; $c++) {
 echo $c . ' ';
}

然而结果却不是他想要的a到z
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai
aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh
bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg
ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df
dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee
ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex... on to yz

实现a到z的打印有N多的办法,比如说如下几种
for ($i = 'a'; $i != 'aa'; $i++)
 echo $i . ' ';
 
 
for ($i = ord('a'); $i <= ord('z'); $i++)
 echo chr($i) . ' ';
 
 
echo implode(' ', range('a', 'z'));

但我们还是要解释上面打印的那一堆是什么鬼?
这是因为在处理单个字符变量的算术操作时,PHP沿袭了Perl的用法而非C的。
在Perl中
$a = 'Z';
$a++; //'AA'

在C中
a = 'Z';
a++;  //'['   因为'Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91

注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z),如下可见:
$a="9F9";
$b="9F9";
var_dump(++$a); //"9G0"
var_dump(--$b); //"9F9"  不变

然后有写成这样的同学哭了
$a = "9E0";
var_dump(++$a);  // float(10)
 
#这TM又变成科学计数法了啊。。。

PHP从来不按套路出牌啊!

下面我们来看一篇关于Laravel Elixir运行glup命令:Error in plugin ‘gulp-notify’的例子,希望这篇教程能够帮助到各位朋友。

Laravel Elixir运行glup命令出现错误提示:

[20:24:02] gulp-notify: [Error in notifier] Error in plugin ‘gulp-notify’
Message:notify-send must be installed on the system.

虽然不影响最终的发布,但是还是解决这个问题。


glup_notify_send

解决这个错误提示的方法是安装libnotify模块,在CentOS下:

rpm -ivh ftp://195.220.108.108/linux/centos/7.2.1511/os/x86_64/Packages/libnotify-0.7.5-8.el7.x86_64.rpm

通过这个命令即可安装。

然后再次运行glup,没有之前的报错。

页面编码在php中我们可以使用head来进行申明了,下面我们就一起来看看PHP 页面编码声明方法详解(header或meta),具体的如下介绍。

php的header来定义一个php页面为utf编码或GBK编码

php页面为utf编码
header("Content-type: text/html; charset=utf-8");

php页面为gbk编码
header("Content-type: text/html; charset=gb2312");

php页面为big5编码
header("Content-type: text/html; charset=big5");

通常情况以上代码放在php页面的首页

用header或meta实现PHP页面编码的区别
一、页面编码

1. 使用 标签设置页面编码

这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx可以为GB2312,GBK,UTF-8(和MySQL不同,MySQL是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。但是有的时候我们会 发现有了这句还是不行,不管xxx是哪一种,浏览器采用的始终都是一种编码,这个情况我后面会谈到。

请注意,是属于html信息的,仅仅是一个声明,它起作用表明服务器已经把HTML信息传到了浏览器。

2. header(“content-type:text/html; charset=xxx”);

这个函数header()的作用是把括号里面的信息发到http标头。

如果括号里面的内容为文中所说那样,那作用和标签基本相同,大家对照第一个看发现字符都差不多的。但是不同的是如果有这段 函数,浏览器就会永远采用你所要求的xxx编码,绝对不会不听话,因此这个函数是很有用的。为什么会这样呢?那就得说说HTTPS标头和HTML信息的差 别了:

https标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串。

因为meta标签是属于html信息的,所以header()发送的内容先到达浏览器,通俗点就是header()的优先级高于meta(不知道可 不可以这样讲)。加入一个php页面既有header(“content-type:text/html; charset=xxx”),又有,浏览器就只认前者http标头而不认meta了。当然这个函数只能在php页面内使用。

同样也留有一个问题,为什么前者就绝对起作用,而后者有时候就不行呢?这就是接下来要谈的Apache的原因了。

3. AddDefaultCharset

Apache 根目录的 conf 文件夹里,有整个Apache的配置文档httpd.conf。

用文本编辑器打开httpd.conf,第708行(不同版本可能不同)有AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件https标头里的字符集为你默认的xxx字符集。有这行,就相当于给每个文件都 加了一行header(“content-type:text/html; charset=xxx”)。这下就明白为什么明明meta设置了是utf-8,可浏览器始终采用gb2312的原因。

如果网页里有header(“content-type:text/html; charset=xxx”),就把默认的字符集改为你设置的字符集,所以这个函数永远有用。如果把AddDefaultCharset xxx前面加个“#”,注释掉这句,而且页面里不含header(“content-type…”),那这个时候就轮到meta标签起作用了。

总结:

来个排序

header(“content-type:text/html; charset=xxx”)
AddDefaultCharset xxx

如果你是web程序员,给你的每个页面都加个header(“content-type:text/html; charset=xxx”),保证它在任何服务器都能正确显示,可移植性强。

至于那句AddDefaultCharset xxx,要不要注释就仁者见仁了。反正我是注释掉了,不过我写页子也要写header(),便于放到服务器上能正常显示。

二、数据库编码

PHP 程序在查询数据库之前,首先执行 mysql_query(“SET NAMES xxxx”);其中 xxxx 是你网页的编码(charset=xxxx),如果网页中 charset=utf8,则 xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,几乎所有WEB程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入 mysql_query(“set names”)就可以了。

SET NAMES 显示客户端发送的 SQL 语句中使用什么字符集。因此,SET NAMES ‘utf-8’语句告诉服务器“将来从这个客户端传来的信息采用字符集utf-8”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一 个SELECT语句,它表示列值使用了什么字符集。)

PHP页面编码统一

MySQL数据库编码、html页面编码、PHP或html文件本身编码要全部一致。
  1、MySQL数据库编码:建立数据库时指定编码(如gbk_chinese_ci),建立数据表、建立字段、插入数据时不要指定编码,会自动继承数据库的编码。
数据库连接时,也有编码,可以在连接完数据库后,执行
mysql_query(‘SET NAMES gbk’);//将gbk换成你的编码,如utf8。

  2、html页面的编码,指的是这一行的设置:
  3、PHP或html文件本身的编码:用editplus打开php文件或html文件,另存时,选择的编码,如果数据库和页面编码是gbk,则这儿的编码选择ansi;如果数据库和页面编码是utf-8,则这儿也选择utf-8。

  4、另外要注意的是,Javascript或Flash中传递的数据是utf-8编码,如果数据库和页面编码是gbk,要进行转码,然后写入数据库。
iconv(‘utf-8’, ‘gbk’, $content);

5、在PHP程序中,可以加上一行,来指定PHP源程序的编码:
header(‘Content-type: text/html; charset=gbk’);

本文章来为各位给各位介绍一篇关于Yii添加百度编辑器 ueditor 扩展例子,希望这篇教程能够帮助到各位。

这是别人写的一个yii1的百度编辑器ueditor的扩展,站长我已经用在了自己的项目中,现在记录下用法和使用中出现的问题。

目录结构

baiduUeditor
|--resource //ueditor资源包
|--views //widget的视图
|--config.php //后端配置文件 包括文件格式 大小 目录 路径 文件名等等
|--UeditorController.php //后端主控制器 可以修改继承类为自定义的基类
|--UeditorWidget.php //widget主要渲染编辑器
|--Uploader.class.php //上传等主要处理类

使用

1、将baiduUeditor拷贝到protected/extensions/目录下
2、添加以下代码到config/main.php


'controllerMap'=&gt;array(
'ueditor'=&gt;array(
'class'=&gt;'ext.baiduUeditor.UeditorController',
),
),

如果你想只在某个module里使用,请添加以下代码到modules/moduleName/moduleNameModule.php的init方法中


$this-&gt;controllerMap=array(
'ueditor'=&gt;array(
'class'=&gt;'ext.baiduUeditor.UeditorController',
),
);

在要显示编辑器的view中放置如下代码


$this-&gt;widget('ext.baiduUeditor.UeditorWidget',
array(
'id'=&gt;'article_content',//容器的id 唯一的[必须配置]
'name'=&gt;'content',//post到后台接收的name [必须配置]
'content'=&gt;'',//初始化内容 [可选的]

//配置选项,[可选的]
//将ueditor的配置项以数组键值对的方式传入,具体查看ueditor.config.js
//不要配置serverUrl(即使配置也会被覆盖)程序会自动处理后端url
'config'=&gt;array(
'toolbars'=&gt;array(array('fullscreen', 'source', '|')),//toolbars注意是嵌套两个数组
'lang'=&gt;'zh-cn'
)
)
);
按照上边的步奏,不出意外的话,编辑器肯定会显示在页面上。

问题:上传图片不能用会报,后端配置项没有正常加载,上传插件不能正常使用的错误。

解决方法:目录结构中有这个UeditorController.php文件,请将此文件放到你网站的controller目录下,因为上传图片最终会访问到此文件,我网站的访问路径是/admin/index.php?r=ueditor&action=config&&noCache=1464083990339,看到这个路径应该就明白了吧。不懂的在加群问我吧!群QQ:66357155

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • 美图秀秀把普通照片快速转换成卡通效果教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下把普通照片快速转换成卡通效果的教程,各位想知道具体制作步骤的使用者们,那么下面就快阿里跟着小编一起看一...2016-09-14
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#读取文件所有行到数组的方法

    这篇文章主要介绍了C#读取文件所有行到数组的方法,涉及C#针对文件及数组的相关操作技巧,需要的朋友可以参考下...2020-06-25