PHP杂技(二)

本文探讨了PHP中的数组操作技巧,包括array_merge与展开运算符的使用区别,以及字符串处理、函数定义与调用等高级特性。同时介绍了如何递归删除目录下的所有文件和文件夹,并实现了一个类似于explode的自定义函数。
摘要由CSDN通过智能技术生成

php array_merge($a,$b)与 $a+$b区别

 array_merge 数字键名会被重新编号,what's '...'

$data = [[1, 2], [3], [4, 5]];
var_dump($data); // [[1, 2], [3], [4, 5]];
var_dump(... $data); // [1, 2, [3], [4, 5]];
var_dump(array_merge($data)); //[[1, 2], [3], [4, 5]];
var_dump(array_merge(... $data)); // [1, 2, 3, 4, 5];

 

php嵌套

<?php
function a(){
    echo 'a';
    function b(){
        echo 'b';
        function c(){
            echo 'c';
        }
    }
}
//
a();c(); //a
a(); b(); c(); //abc

必须先执行外部函数才能依次调用,直接调用b无返回结果;

<?php
if (!function_exists('a')) {
    function a(){
        echo 'in a';
    }
}
function a(){
    echo 'out a';
}

a(); //'out a'
<?php
if (!function_exists('a')) {
    function a(){
        echo 'in a';
    }
}
a(); //'in a'

 

 

<?php
return ['a'=>'b'];
function a($a){
    var_dump($a);
}
a(include ./a.php); //['a'=>'b']   

 

PHP数组相关:

$a = ['a' => 'b', 'c' => 'd'];
$a[] = ['e'=>'f'];
echo '<pre>';
var_dump($a);

 

//需求解析url,类似与bash
/*
* * @param $url string "ab/{cd,ef,gh}/{ij,kl}" * @return array ['abcdij','abcdkl','abefij','abefkl','abghij','abghkl'] */
//总觉得有还有很大的优化空间 2017-12-20 13:47:17
function preUrl($url = "01/ab/{cd,ef,gh}/{ij,kl}") { static $result = []; $pattern = '/{(\w+,)*(\w+)}/'; if (preg_match($pattern, $url, $matches)) { $head = strstr($url, $matches[0], true); $tail = substr(strstr($url, $matches[0]), strlen($matches[0])); foreach (explode(',', rtrim(ltrim($matches[0], '{'), '}')) as $value) { $tempUrl = $head . $value . $tail; if (preg_match($pattern, $tempUrl, $matches)) { preUrl($tempUrl); } else { $result[] = $tempUrl; } } } else { $result = [$url]; } return $result; }

 

处理字符串想通过换行符来分割成数组

explode('\r\n', $a); //错误
explode("\r\n", $a); //正确

 

php删除目录下所有文件和文件夹

    public function removePrizeData($attachPath = null)
    {
        $prizeDataPath = is_null($attachPath) ? Env::get('ROOT_PATH') . self::PRIZE_FILE_PATH : $attachPath;
        if ($handle = opendir($prizeDataPath)) {
            while (false !== ($file = readdir($handle))) {
                if ($file == '.' || $file == '..') continue;
                if (is_dir($prizeDataPath . '/' . $file)) {
                    $this->removePrizeData($prizeDataPath . '/' . $file);
                    rmdir($prizeDataPath . '/' . $file);
                } else {
                    unlink($prizeDataPath . '/' . $file);
                }
            }
            closedir($handle);
        }
    }

 类似explode函数,但可以指定返回类型 2018-02-28 16:51:22

    /**
     * foreach(explodeType(',', '1,2,3', 'int', [2]) as $value) dump($value);
     * output:  int(1)
     *          int(3)
     * @param string $delimiter 切割符号
     * @param string $string 被切割字符串
     * @param string $valueType 返回的结果类型
     * @param array $filter 过滤器,想要清洗的值,可以修改成闭包让功能更多
     * @return \Generator
     * @author GP 20180228
     */
    static public function explodeType(string $delimiter, string $string, string $valueType = 'int', array $filter = [])
    {
        $loop = function () use ($string, $delimiter) {
            static $begin = true;
            if ($begin) {
                $begin = false;
                return strtok($string, $delimiter);
            } else {
                return strtok($delimiter);
            }
        };
        $filter = function ($result) use ($filter) {
            return in_array($result, $filter) ? true : false;
        };
        while (false !== $temp = $loop()) {
            switch ($valueType) {
                case 'int':
                    $i = (int)$temp;
                    if ($filter && true === $filter($i)) continue;
                    yield $i;
            }
        }
    }

 

发现了一个php语法,可以对null取元素,结果也是null

var_dump(null['a'][0]['b']); ===>>> null

 

转载于:https://www.cnblogs.com/8000cabbage/p/7879486.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值