forecho 的独立博客

把生命浪费在美好的事物上

PHP对象转成数组的函数

2013年07月16日

对象和数组的区别:

  • 数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
  • 数组的数据没有”名称”(name),对象的数据有”名称”(name)。(例外:在Javascript语言中,关联数组就是对象,对象就是关联数组。)

    /** * 对象转数组 * @author 佚名 * @param object $obj * @return array */ function object_to_array($obj){ $_arr = is_object($obj) ? get_object_vars($obj) : $obj; foreach ($_arr as $key => $val){ $val = (is_array($val) || is_object($val)) ? $this->object_to_array($val) : $val; $arr[$key] = $val; } return $arr; }

[is_object ](http://www.php.net/manual/zh/function.is-object.php): 检测变量是否是一个对象。 [get_object_vars](http://php.net/manual/zh/function.get-object-vars.php) : 返回由对象属性组成的关联数组。 参考资料: http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html https://gist.github.com/suziewong/4316491

Vim编辑器使用(一)

2013年07月09日

默认是一般模式

按 i、I、o、O、a、A、r、R进入编辑模式

按:、/、?进入命令行模式

补充解释:

i, I 进入插入模式(Insert mode):
i为『从目前鼠标所在处插入』, I为『在目前所在行的第一个非空白字元处开始插入』。( 常用 )

a, A 进入插入模式(Insert mode):
a为『从目前鼠标所在的下一个字元处开始插入』, A为『从鼠标所在行的最后一个字元处开始插入』。( 常用 )

o, O 进入插入模式(Insert mode):
这是英文字母o的大小写。o为『在目前鼠标所在的下一行处插入新的一行』; O为在目前鼠所在处的上一行插入新的一行!( 常用 )

r, R 进入取代模式(Replace mode):
r只会取代鼠标所在的那一个字元一次;R会一直取代鼠标所在的文字,直到按下ESC为止;( 常用 )

Vim编辑器使用(二)——一般模式

2013年07月09日

一般模式:移动光标的方法(#表示常用)

  • h -> 光标向左移动一个字符#
  • j -> 光标向下移动一个字符#
  • k -> 光标向上移动一个字符#
  • l -> 光标向右移动一个字符#
  • n -> n表示数字,如果想进行多次移动的话还可以加上数字,例如10j。
  • [Ctrl]+[f] -> 屏幕向下移动一页,相当于[Page Down]按键#
  • [Ctrl]+[b] -> 屏幕向上移动一页,相当于[Page Up]按键#  
  • + -> 光标移动到非空格的下一行
  • - -> 光标移动到非空格的上一行
  • n -> n表示数字,光标向右移动到该行的n个字符
  • 0 -> 光标移动到这一行最前面的字符处#
  • $ -> 光标移动到这一行最后面的字符处#
  • H -> 光标移动到屏幕的最上方那一行
  • M -> 光标移动到屏幕的中央那一行
  • L -> 光标移动到屏幕的最下方那一行
  • G -> 光标移动到文件的最后一行#
  • nG -> n表示数字,移动到这个文件的n行#
  • gg -> 光标移动到文件的第一行#
  • n -> n表示数字,光标向下n行#

一般模式:搜索与替换(#表示常用)

  • /word -> 从光标位置开始,向下寻找一个名为 word的字符
  • ?word -> 从光标位置开始,向上寻找一个名为 word的字符
  • n -> n表示数字,表示重复前一个搜索动作
  • N -> N表示数字,表示反向重复前一个搜索动作
  • :%s/word1/word2/g -> 将文件中的word1字符串,并将该字符串替换成word2 #
  • :%s/word1/word2/gc -> 将文件中的word1字符串,并将该字符串替换成word2,在替换前会显示提示符给用户确认 #

一般模式:删除,复制与粘贴(#表示常用)

  • x、X -> 在一行中,x向后删除字符,X向前删除字符#
  • nx -> n表示数字,连续向后删除n个字符
  • dd -> 删除光标所在的一整行#
  • ndd -> n表示数字,从光标位置开始,删除向下的n行#
  • d1G -> 删除光标所在位置到第一行所有的数据#
  • dG -> 删除光标所在位置到最后一行所有的数据#
  • d$ -> 删除光标所在位置到改行的最后一个字符
  • d0 -> 删除光标所在位置到改行的最前一个字符
  • yy -> 复制光标所在的一整行#
  • nyy -> n表示数字,复制光标所在的向下n行#
  • y1G -> 复制光标所在位置到第一行所有的数据#
  • yG -> 复制光标所在位置到第一行所有的数据#
  • y0 -> 复制光标所在的那个字符到该行行首的所有数据
  • y$ -> 复制光标所在的那个字符到该行行尾的所有数据
  • p、P -> p将已复制的数据粘贴到光标下一行,P相反#
  • J -> 将光标所在的行与下一行结合在一起#
  • c -> 重复删除多个数据
  • u -> 复原前一个操作,撤销#
  • [Ctrl]+[r] -> 重复上一个操作,恢复#
  • . -> 重复前一个动作#

Mac OS X PHP环境下新增虚拟主机

2013年07月09日

注:这里只是新增,如果是第一次开启虚拟主机,请参考这篇文章。 1、运行sudo vim /etc/apache2/extra/httpd-vhosts.conf,就打开了配置虚拟主机文件httpd-vhost.conf,配置虚拟主机了。增加虚拟主机代码如下:

<VirtualHost *:80>
    DocumentRoot "/Users/[用户名]/Sites/site"
    ServerName www.site.com
    ErrorLog "/private/var/log/apache2/sites-error_log"
    CustomLog "/private/var/log/apache2/sites-access_log" common
    <Directory />
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order deny,allow
                Allow from all
      </Directory>
</VirtualHost>

2、保存退出,并重启Apache。

sudo apachectl restart

3、运行sudo vim /etc/hosts,打开hosts配置文件,加入”127.0.0.1 www.site.com”,这样就可以配置完成sites虚拟主机了,访问“http://www.site.com”就相当于访问/Users/[用户名]/Sites/site文件下面的项目了。   补充:Mac默认PHP配置文件在 /private/etc/php.ini

PHP去除二维数组中的空数组

2013年07月03日

关键是array_filter这个函数;例子: 原数组:

Array
(
    [0] => Array
        (
            [ExchangeNo] => ECR000033
            [CardNo] => Array
                (
                )

            [QTY] => 1
            [ExchangeDate] => 2013-06-13T18:55:23.84
            [Remark] => Array
                (
                )

        )

    [1] => Array
        (
            [ExchangeNo] => ECR000036
            [CardNo] => Array
                (
                )

            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:24:32.53
            [Remark] => Array
                (
                )

        )

    [2] => Array
        (
            [ExchangeNo] => ECR000037
            [CardNo] => Array
                (
                )

            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:28:23.14
            [Remark] => Array
                (
                )

        )

    [3] => Array
        (
            [ExchangeNo] => ECR000038
            [CardNo] => Array
                (
                )

            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:30:53.71
            [Remark] => Array
                (
                )

        )

)

去除空数组:

foreach ($array as $key=>$value){
	 $array[$key] = array_filter($value);
}

输出结果:

Array
(
    [0] => Array
        (
            [ExchangeNo] => ECR000033
            [QTY] => 1
            [ExchangeDate] => 2013-06-13T18:55:23.84
        )

    [1] => Array
        (
            [ExchangeNo] => ECR000036
            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:24:32.53
        )

    [2] => Array
        (
            [ExchangeNo] => ECR000037
            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:28:23.14
        )

    [3] => Array
        (
            [ExchangeNo] => ECR000038
            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:30:53.71
        )
)

iOS开发实例(七)- 标签栏与选取器

2013年07月02日

由于很多事给耽误了,半年都没碰iOS了,惭愧。希望现在继续还来得及。 其实 这篇文章教程写的很详细了:http://www.cnblogs.com/minglz/archive/2012/12/27/2828663.html 只要参照这个教程来基本上就没有什么问题了。 补充一个问题:Xcode 貌似在4.6版本之后在 New-> File->Cocoa Touch 的时候就没有「UIViewController Subclass」了。 解决办法就是直接用New-> File->Cocoa Touch ->Objective-C Class ,主要注意的是SubClass of 必须是 UIViewController

把项目移植到Ubuntu上遇到的一些坑 - PHP5.4降级到PHP5.3

2013年06月25日

其实在Ubuntu上搭建PHP环境不是很难,可以参考这篇文章-手把手教你在Ubuntu上安装Apache、MySql和PHP。 PHP 默认是没有开启报错信息的,需要手动开启,可以参考这篇文章-开启Ubuntu下的PHP错误提示。 环境搭建好之后,运行项目发现有很多错误,很多坑,有点莫名其妙的感觉。 Google问题之后也不知道如何解决,后来找到了这篇文章- PHP5.4中一个需要注意的变化(Chained string offsets) 。 这才发现可能是我的PHP 版本问题,Ubuntu默认安装的是PHP5.4版本,这个版本较之前的PHP5.3有一些改动。 于是找到了这篇文章-Ubuntu 12.10 php5.4 降级到 php5.3脚本。 大致就是先下载一个文件,然后修改这个文件的权限:

sudo chmod 755 php5_4_downgrade_5.3.sh

然后运行这个文件:

sudo sh php5_4_downgrade_5.3.sh

后面的选择,如果看不懂就直接选默认吧。最后降级成功,问题解决。

在Ubuntu(12.10/12.04/11.10/11.04)上安装RabbitVCS SVN,Git的客户端

2013年06月22日

1.首先安装一些环境:

$ sudo apt-get update
$ sudo apt-get install python-nautilus python-configobj python-gtk2 python-glade2 python-svn python-dbus python-dulwich subversion meld gconf-editor

2.将压缩包下载,解压并运行安装脚本:

$ wget http://rabbitvcs.googlecode.com/files/rabbitvcs-0.15.2.tar.bz2
$ tar jxvf rabbitvcs-0.15.2.tar.bz2
$ cd rabbitvcs-0.15.2/
$ sudo python setup.py install --install-layout=deb

cd到nautilus-3.0的客户端目录下和复制的RabbitVCS.py扩展目录:

$ cd clients/nautilus-3.0
$ sudo cp RabbitVCS.py /usr/share/nautilus-python/extensions/

注销并重新登录。现在创建一个文件夹,右键点击它,看看RabbitVCS菜单。 原英文地址:http://linuxdrops.com/install-rabbitvcs-svn-git-client-on-ubuntu-12-1012-0411-1011-04/ apt-get 自动安装:http://www.webupd8.org/2011/01/rabbitvcs-perfect-tortoisesvn.html

Yii添加Ajax搜索

2013年06月08日

其实默认就有,只需要开启就好了。 首先先把列表写好。列表用'dataProvider'=>$product->search(40),//数据源 调用数据源 View页面: 添加Ajax:

<?php
Yii::app()->clientScript->registerScript('search', "
$('.search-form form').submit(function(){
	$.fn.yiiGridView.update('product-grid', {
		data: $(this).serialize()
	});
	return false;
});
");
?>

表单:

<div class="pro_filter c_f search-form">
<?php $form=$this->beginWidget('CActiveForm', array(
	'action'=>Yii::app()->createUrl($this->route),
	'method'=>'get',
)); ?>
<label>产品标题:</label>
<?php echo $form->textField($product,'name',array('class'=>'t_ipt w_180'))?>
<?php echo CHtml::submitButton('搜索',array('class'=>'mem_bgx mem_btn01'))?>
<?php $this->endWidget(); ?>
</div>

  Controller里面要有如下代码:

$product = New Product();
$product->unsetAttributes();//清空属性
$product->id = $id;
if(isset($_GET['Product'])){
	$product->attributes = $_GET['Product'];
}

model 基本是用的是Search 不需要改什么。注意:compare后面有参数true则为模糊搜索,实例:

$criteria->compare('name',$this->name,true);

jQuery Ajax This的问题

2013年06月05日

写了一个鼠标点击按钮Ajax效果,代码如下:

<script type="text/javascript">
//报名参加活动
$('.right a').bind('click',function(){
    var id = $(this).next('.d_n').text();
    $.ajax({
        url:"<?php echo Yii::app()->createUrl('/ajax/AjaxJoinActivity/') ?>",
        type:'POST',
        data:'id='+id,
        success:function(msg){
            $(this).html(msg);
        }
    });
})
</script>

但是这样写会有个问题,就是$(this)没有效果,Google找了一下解决方案,如下: 1、添加一行代码:context: this,修改之后的代码如下:

<script type="text/javascript">
//报名参加活动
$('.right a').bind('click',function(){
    var id = $(this).next('.d_n').text();
    $.ajax({
        context: this,
        url:"<?php echo Yii::app()->createUrl('/ajax/AjaxJoinActivity/') ?>",
        type:'POST',
        data:'id='+id,
        success:function(msg){
            $(this).html(msg);
        }
    });
})
</script>

2、转换一下this变量,重新定义。改过之后的代码如下:

<script type="text/javascript">
//报名参加活动
$('.right a').bind('click',function(){
    var id = $(this).next('.d_n').text();
    var that = this;
    $.ajax({
        url:"<?php echo Yii::app()->createUrl('/ajax/AjaxJoinActivity/') ?>",
        type:'POST',
        data:'id='+id,
        success:function(msg){
            $(that).html(msg);
        }
    });
})
</script>

以上都能解决问题,看你喜欢那种了。 参考资料如下: http://stackoverflow.com/questions/6394812/this-inside-of-ajax-success-not-working http://stackoverflow.com/questions/1570146/ajax-jquery-success-scope