>

PHP5.澳门博发娱乐官网:4源码注解,下面也是新

- 编辑:澳门博发娱乐官网 -

PHP5.澳门博发娱乐官网:4源码注解,下面也是新

array explode (string $separator, string $string [, int $limit])

implode

string implode ( string $glue, array $pieces )
string implode ( array $pieces )

将一个一维数组的值转换为字符串

行看看这两个函数

一、 时间日期函数

date(),strtotime(),mktime(),time(),microtime(), date_default_timezone_set("Asia/Shanghai");
  • date — 格式化一个本地时间/日期
    string date ( string $format [, int $timestamp ] )
    返回将整数 timestamp
    按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp
    是可选的,默认值为 time()。
  • time() 返回当前的 Unix 时间戳
    int time ( void )
date_default_timezone_set("Asia/Shanghai");
echo $showtime=date("Y-m-d H:i:s",time());
  • strtotime()— 将任何字符串的日期时间描述解析为 Unix 时间戳
function diffBetweenTwoDays ($day1, $day2)
{
  $second1 = strtotime($day1);
  $second2 = strtotime($day2);

  if ($second1 < $second2) {
    $tmp = $second2;
    $second2 = $second1;
    $second1 = $tmp;
  }
  return ($second1 - $second2) / 86400;
}
$day1 = "2013-07-27";
$day2 = "2013-08-04";
$diff = diffBetweenTwoDays($day1, $day2);
echo $diff."n";

与分割字符串函数相对应的是implode,函数原型分别如下。string implode(string $glue, array $pieces)string join(string $glue, array $pieces)

源码解读

sizeof("") == 0。sizeof有两种用法,sizeof(typename)sizeof(expression),当参数为typename是,即类型名称,sizeof返回类型对应对象的大小;当参数为表达式时,sizeof计算表达式的返回类型对应对象的大小。此处,""是表达式,sizeof计算编译时编译器分配给""的空间,此时要算上的长度,因此是1,而strlen函数不会计算。

如果不设置limit,limit的默认值是LONG_MAX。在php.h文件中,LONG_MAX定义为2147483647L。

在实现里面,如果limit大于1,则调用php_explode函数;如果limit小于0,则调用php_explode_negative_limit函数;如果limit等于0,则被当做1处理,此时调用add_index_stringl函数将str添加到数组return_value中。

在查找分隔符delimiter时,调用了php_memnstr函数
 php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp); 
而php_memnstr是zend_memnstr的宏定义,zend_memnstr实现里面,因此实际上是调用了C里面的memchr来查找字符delimiter。

找到分隔符的位置之后,就调用add_next_index_stringl函数将分隔得到的字符串插入到返回数组里。

//将多维数组中所有的数值转换成字符串????》最多支持三维数组
function implodex( $glue, $array, $separator='' ) {
if ( ! is_array( $array ) ) return $array;
$string = array();

打印处理函数

print(),print_r(),echo,printf(),sprintf(),var_dump(),var_export()
  • print 只能输出一个变量
    echo 可以多个变量,建议用echo
$url = "https:%s";
$prefix = "http";
$mergeurl = sprintf($url,"www.zhitaochan.cn");
// print $mergeurl,$prefix;//语法错误
echo $mergeurl,$prefix;//可以输出
  • var_export()
    var_export — 输出或返回一个变量的字符串表示,返回的变量是复合php语法的可以直接使用 ,而var_dump()则不能。

该函数有3个参数,第一个参数$separator设置一个分割字符。第二个参数$string指定所要操作的字符串。$limit参数是可选的,指定最多将字符串分割为多少个子串。该函数返回一个由被分割的子串组成的数组。

参数说明

implode函数可以接收两种参数顺序。另外,如果第一个参数为数组而第二个参数为空,则第二个参数为默认值''。此函数可以看作是explode的逆向过程。

当然,使用文档规定的顺序可避免混淆。

if(empty($separator))$separator = $glue;

字符串处理函数

implode(),explode(),join(),strrev(),trim(),ltrim(),rtrim(),strstr(),number_formate(),
  • implode()
    implode — 将一个一维数组的值转化为字符串
    string implode ( string $glue , array $pieces )
    string implode ( array $pieces )
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
  • explode()

explode — 使用一个字符串分割另一个字符串

array explode ( string $delimiter , string $string [, int $limit ] )
此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。

<?php
// 示例 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

// 示例 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *

?>
  • join()
    别名 implode
$array = array('lastname', 'email', 'phone');
$comma_separated = join(",", $array);
print $comma_separated;
  • strrev()
    反转字符串
    string strrev ( string $string )

  • trim()
    去除字符串首尾处的空白字符(或者其他字符)

  • ltrim()
    删除字符串开头的空白字符(或其他字符)

  • rtrim()
    删除字符串末端的空白字符(或者其他字符)

  • strstr()
    查找字符串的首次出现

<?php
$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // 打印 @example.com

$user = strstr($email, '@', true); // 从 PHP 5.3.0 起
echo $user; // 打印 name
?>
  • number_format
    以千位分隔符方式格式化一个数字

来看下面的例子,对一个由逗号分隔的多行文本数据进行分析。例1,分割字符串。

运行示例

$arr = array('hello', 'world');

 

按照文档顺序参数

$str = implode('-‘, $arr);// 输出"hello-world"

 

第一个参数为数组

$str = implode($arr); // 输出"helloworld"
$str = implode($arr, '-'); // 输出"hello-world"

 

下面看一个实例:

ip处理函数

  • ip2long — 将一个IPV4的字符串互联网协议转换成数字格式
    int ip2long ( string $ip_address )
  • long2ip — 将长整型转化为字符串形式带点的互联网标准格式地址(IPV4)

例2:复制代码 代码如下:

implode执行步骤

1、接收参数并赋值
2、如果第二个参数为空,则判断第一个参数的类型是否为数组,如果不是,则报错。否则,则使用""对glue赋值,使用其作为连接符。
3、如果第二个参数不为空,那么,如果第一个参数是数组类型,则将第二个参数转换成字符串类型;否则,如果第二个参数是数组类型,则将第一个参数转换成字符串类型。
4、调用php_implode函数做字符串的连接。

在implode函数设置完参数之后,底层就调用php_implode函数进行字符串连接,php_implode函数的执行流程图如下:

澳门博发娱乐官网 1

php_implode函数核心代码:

    // 遍历数组的每一个元素,判断其类型,然后调用smart_str_appendl函数将值追加到字符串中
    while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **) &tmp, &pos) == SUCCESS) {
        switch ((*tmp)->type) {
            case IS_STRING:
                smart_str_appendl(&implstr, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
                break;

            case IS_LONG: {
                char stmp[MAX_LENGTH_OF_LONG + 1];
                str_len = slprintf(stmp, sizeof(stmp), "%ld", Z_LVAL_PP(tmp));
                smart_str_appendl(&implstr, stmp, str_len);
            }
                break;

            case IS_BOOL:
                if (Z_LVAL_PP(tmp) == 1) {
                    smart_str_appendl(&implstr, "1", sizeof("1")-1);
                }
                break;

            case IS_NULL:
                break;

            case IS_DOUBLE: {
                char *stmp;
                str_len = spprintf(&stmp, 0, "%.*G", (int) EG(precision), Z_DVAL_PP(tmp));
                smart_str_appendl(&implstr, stmp, str_len);
                efree(stmp);
            }
                break;

            case IS_OBJECT: {
                int copy;
                zval expr;
                zend_make_printable_zval(*tmp, &expr, &copy);
                smart_str_appendl(&implstr, Z_STRVAL(expr), Z_STRLEN(expr));
                if (copy) {
                    zval_dtor(&expr);
                }
            }
                break;

            default:
                tmp_val = **tmp;
                zval_copy_ctor(&tmp_val);
                convert_to_string(&tmp_val);
                smart_str_appendl(&implstr, Z_STRVAL(tmp_val), Z_STRLEN(tmp_val));
                zval_dtor(&tmp_val);
                break;

        }

        // 添加glue字符
        if (++i != numelems) {
            smart_str_appendl(&implstr, Z_STRVAL_P(delim), Z_STRLEN_P(delim));
        }
        zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos);
    }
    // 在尾部添加结束字符0
    smart_str_0(&implstr);

 

例2.
上面只支持一维数据,如果是二维或三维数据呢

序列化和反序列化

  • serialize
    产生一个可存储的值的表示
  • unserialize
    比较serialize与json_encode
<?php
$target = array (    
   'battle_id'=> 257    
   ,'user_id'=> 41248    
   ,'user_id2'=> 23989    
   ,'player'=> 41248    
   ,'formation'=> Array    
        (    
           '41248'=> 1    
           ,'23989'=> 2    
        )    

   ,'result'=> 1    
   ,'battle_type'=> 1    
   ,'speed'=> Array    
        (    
           '41248'=> 0    
           ,'23989'=> 0    
        )    
);
$json = json_encode($target);
$seri = serialize($target);
print($json);
print("n");
print($seri);

2.对象的解析

<?php
//声明一个类
class dog {

    var $name;
    var $age;
    var $owner;

    function dog($in_name="unnamed",$in_age="0",$in_owner="unknown") {
        $this->name = $in_name;
        $this->age = $in_age;
        $this->owner = $in_owner;
    }

    function getage() {
        return ($this->age * 365);
    }

    function getowner() {
        return ($this->owner);
    }

    function getname() {
        return ($this->name);
    }
}
//实例化这个类
$ourfirstdog = new dog("Rover",12,"Lisa and Graham");
//用serialize函数将这个实例转化为一个序列化的字符串
$dogdisc = serialize($ourfirstdog);
print $dogdisc; //$ourfirstdog 已经序列化为字符串 O:3:"dog":3:{s:4:"name";s:5:"Rover";s:3:"age";i:12;s:5:"owner";s:15:"Lisa and Graham";}

print '<BR>';

$json = json_encode($ourfirstdog);
print $json;//{"name":"Rover","age":12,"owner":"Lisa and Graham"}

implode函数可以将数组$pieces中的元素用指定的字符$glue连接起来。下面为大家举一个简单的例子,供学习参考。

小结

暂且写这么多吧,还有更多的优化和PHP源码中常用的函数,将会在以后的源码阅读中慢慢讲述。

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,请点下推荐吧,谢谢^_^

 

最后再安利一下,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

更多源码文章,欢迎访问个人主页继续查阅:hoohack

使用函数 implode 将数组转换为字符串

数组的处理函数

array_keys(),array_values(),array_diff(),array_intersect(),array_merge(),array_shift(),array_unshift(),array_pop(),array_push(),sort()
  • array_keys
    返回数组中部分的或所有的键名

  • array_values()
    array_values — Return all the values of an array

  • array_diff()
    array与一个或多个其他数组进行 比较,并返回其中array1不存在于其他数组中的值。

  • array_intersect()
    计算数组的交集
    array array_intersect ( array $array1 , array $array2 [, array $... ] )

array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。

  • array_merge
    合并一个或多个数组
    array array_merge ( array $array1 [, array $... ] )
    array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引

  • array_shift()
    将数组开头的单元移出数组
    array_shift() 将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack);
?>

输出:

Array
(
    [0] => banana
    [1] => apple
    [2] => raspberry
)
  • array_unshift()
    在数组开头插入一个或多个单元
    array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。
<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
?>

输出:

Array
(
    [0] => apple
    [1] => raspberry
    [2] => orange
    [3] => banana
)
  • array_pop
    弹出数组最后一个单元(出栈)
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
?>

输出:

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
  • array_push()
    将一个或多个单元压入数组的末尾(入栈)
    array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。

  • sort
    对数组排序

复制代码 代码如下:

 

&con[4]=30&selt[4]=2&con[5]=4&selt[5]=1&con[6]=11&con[7]=12

本文由胜博发-编程发布,转载请注明来源:PHP5.澳门博发娱乐官网:4源码注解,下面也是新