PHP 怎么PHP数组助手

wen PHP项目 2

本文目录导读:

PHP 怎么PHP数组助手

  1. 创建自定义数组助手类
  2. 使用方式示例
  3. 使用第三方库
  4. 扩展原生 PHP 数组函数

在 PHP 中,虽然没有官方名为“数组助手”的类,但可以通过以下几种方式实现类似 Laravel 的 Arr 助手的工具:

创建自定义数组助手类

<?php
class Arr
{
    /**
     * 获取数组中的值(支持点语法)
     */
    public static function get(array $array, $key, $default = null)
    {
        if (is_null($key)) {
            return $array;
        }
        if (array_key_exists($key, $array)) {
            return $array[$key];
        }
        if (strpos($key, '.') === false) {
            return $default;
        }
        foreach (explode('.', $key) as $segment) {
            if (is_array($array) && array_key_exists($segment, $array)) {
                $array = $array[$segment];
            } else {
                return $default;
            }
        }
        return $array;
    }
    /**
     * 检查数组是否存在某个键
     */
    public static function has(array $array, $key)
    {
        if (is_null($key)) {
            return false;
        }
        if (array_key_exists($key, $array)) {
            return true;
        }
        foreach (explode('.', $key) as $segment) {
            if (is_array($array) && array_key_exists($segment, $array)) {
                $array = $array[$segment];
            } else {
                return false;
            }
        }
        return true;
    }
    /**
     * 设置数组值(支持点语法)
     */
    public static function set(array &$array, $key, $value)
    {
        if (is_null($key)) {
            return $array = $value;
        }
        $keys = explode('.', $key);
        while (count($keys) > 1) {
            $key = array_shift($keys);
            if (!isset($array[$key]) || !is_array($array[$key])) {
                $array[$key] = [];
            }
            $array = &$array[$key];
        }
        $array[array_shift($keys)] = $value;
        return $array;
    }
    /**
     * 删除数组中的值(支持点语法)
     */
    public static function forget(array &$array, $keys)
    {
        $original = &$array;
        $keys = (array) $keys;
        foreach ($keys as $key) {
            if (array_key_exists($key, $array)) {
                unset($array[$key]);
                continue;
            }
            $parts = explode('.', $key);
            $array = &$original;
            while (count($parts) > 1) {
                $part = array_shift($parts);
                if (isset($array[$part]) && is_array($array[$part])) {
                    $array = &$array[$part];
                } else {
                    continue 2;
                }
            }
            unset($array[array_shift($parts)]);
        }
    }
    /**
     * 数组转为扁平数组(点语法)
     */
    public static function flatten(array $array, $prefix = '')
    {
        $result = [];
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $result = array_merge(
                    $result,
                    self::flatten($value, $prefix . $key . '.')
                );
            } else {
                $result[$prefix . $key] = $value;
            }
        }
        return $result;
    }
    /**
     * 数组分组
     */
    public static function groupBy(array $array, $key)
    {
        $result = [];
        foreach ($array as $item) {
            if (is_array($item) && isset($item[$key])) {
                $result[$item[$key]][] = $item;
            } elseif (is_object($item) && isset($item->$key)) {
                $result[$item->$key][] = $item;
            }
        }
        return $result;
    }
    /**
     * 随机获取一个或多个值
     */
    public static function random(array $array, $number = 1)
    {
        if ($number === 1) {
            return $array[array_rand($array)];
        }
        $keys = array_rand($array, $number);
        $result = [];
        foreach ((array) $keys as $key) {
            $result[] = $array[$key];
        }
        return $result;
    }
    /**
     * 数组排序
     */
    public static function sort(array $array, $key, $direction = 'asc')
    {
        $direction = strtolower($direction) === 'asc' ? SORT_ASC : SORT_DESC;
        array_multisort(
            array_column($array, $key),
            $direction,
            SORT_REGULAR,
            $array
        );
        return $array;
    }
}

使用方式示例

$user = [
    'name' => '张三',
    'email' => 'zhangsan@example.com',
    'profile' => [
        'age' => 30,
        'address' => [
            'city' => '北京',
            'street' => '长安街'
        ]
    ]
];
// 获取值
echo Arr::get($user, 'name'); // 张三
echo Arr::get($user, 'profile.address.city'); // 北京
echo Arr::get($user, 'no_exist', '默认值'); // 默认值
// 检查存在
var_dump(Arr::has($user, 'profile.age')); // true
var_dump(Arr::has($user, 'no_exist')); // false
// 设置值
$copy = $user;
Arr::set($copy, 'profile.email', 'test@example.com');
Arr::set($copy, 'phone', '13800138000');
// 扁平化
$flat = Arr::flatten($user);
// 结果: [
//   'name' => '张三',
//   'email' => 'zhangsan@example.com',
//   'profile.age' => 30,
//   'profile.address.city' => '北京',
//   'profile.address.street' => '长安街'
// ]
// 分组
$users = [
    ['name' => '张三', 'department' => '技术部'],
    ['name' => '李四', 'department' => '市场部'],
    ['name' => '王五', 'department' => '技术部']
];
$grouped = Arr::groupBy($users, 'department');
// 结果: [
//   '技术部' => [ ['name' => '张三', ...], ['name' => '王五', ...] ],
//   '市场部' => [ ['name' => '李四', ...] ]
// ]
// 随机获取
echo Arr::random(['a', 'b', 'c']); // 随机返回一个
// 排序
$sorted = Arr::sort($users, 'name', 'desc');
// 删除
$copy = $user;
Arr::forget($copy, 'profile.address.city');

使用第三方库

如果不想自己实现,可以使用现成的库:

// 1. Laravel 的 Arr 类 (需要安装 illuminate/support)
composer require illuminate/support
use Illuminate\Support\Arr;
$value = Arr::get($array, 'key');
Arr::set($array, 'key', 'value');
// 2. spatie/array-functions
composer require spatie/array-functions
use Spatie\ArrayFunctions\ArrayFunctions;
ArrayFunctions::get($array, 'key');

扩展原生 PHP 数组函数

function array_get($array, $key, $default = null) {
    return Arr::get($array, $key, $default);
}
function array_set(&$array, $key, $value) {
    return Arr::set($array, $key, $value);
}
// 使用
$user = [];
array_set($user, 'profile.name', '张三');
echo array_get($user, 'profile.name'); // 张三

这些方法可以帮助你更方便地操作 PHP 数组,特别是在处理嵌套数组时非常实用。

抱歉,评论功能暂时关闭!