PHP 数组 如何将新元素加到数组第一个位置(支持指定key => value)

PHP 关联数组添加元素到第一个位置

在 PHP 中,将新元素添加到关联数组的第一个位置有多种方法。以下是几种实现方式:

方法1:使用数组联合运算符 (+)

php 复制代码
/**
 * 将新元素添加到关联数组的第一个位置
 * 
 * @param array $array 原始数组
 * @param mixed $key 新元素的键
 * @param mixed $value 新元素的值
 * @return array 处理后的数组
 */
function addToBeginning(array $array, $key, $value): array
{
    return [$key => $value] + $array;
}

方法2:使用 array_merge函数

复制代码
/**
 * 使用 array_merge 将新元素添加到数组开头
 * 
 * @param array $array 原始数组
 * @param mixed $key 新元素的键
 * @param mixed $value 新元素的值
 * @return array 处理后的数组
 */
function addToBeginningWithMerge(array $array, $key, $value): array
{
    return array_merge([$key => $value], $array);
}

方法3:使用 array_splice函数

php 复制代码
/**
 * 使用 array_splice 将新元素添加到数组开头
 * 
 * @param array $array 原始数组
 * @param mixed $key 新元素的键
 * @param mixed $value 新元素的值
 * @return array 处理后的数组
 */
function addToBeginningWithSplice(array $array, $key, $value): array
{
    array_splice($array, 0, 0, [$key => $value]);
    return $array;
}

方法4:处理键已存在的情况

php 复制代码
/**
 * 将新元素添加到数组开头,如果键已存在则先移除旧值
 * 
 * @param array $array 原始数组
 * @param mixed $key 新元素的键
 * @param mixed $value 新元素的值
 * @return array 处理后的数组
 */
function addToBeginningWithKeyCheck(array $array, $key, $value): array
{
    // 如果键已存在,先移除
    if (array_key_exists($key, $array)) {
        unset($array[$key]);
    }
    
    return [$key => $value] + $array;
}

方法5:批量添加多个元素到开头

php 复制代码
/**
 * 将多个元素添加到数组开头
 * 
 * @param array $array 原始数组
 * @param array $newElements 要添加的新元素数组
 * @return array 处理后的数组
 */
function addMultipleToBeginning(array $array, array $newElements): array
{
    return $newElements + $array;
}

// 或者使用 array_merge
function addMultipleToBeginningWithMerge(array $array, array $newElements): array
{
    return array_merge($newElements, $array);
}

方法6:保持数字键的连续性(如果需要)

php 复制代码
/**
 * 将新元素添加到数组开头,并保持数字键的连续性
 * 
 * @param array $array 原始数组
 * @param mixed $key 新元素的键
 * @param mixed $value 新元素的值
 * @return array 处理后的数组
 */
function addToBeginningWithNumericKeys(array $array, $key, $value): array
{
    // 如果键是数字,重新索引数组
    if (is_numeric($key)) {
        $array = [$key => $value] + $array;
        ksort($array);
        return $array;
    }
    
    return [$key => $value] + $array;
}

使用示例

php 复制代码
// 原始数组
$fruits = [
    'apple' => 'red',
    'banana' => 'yellow',
    'orange' => 'orange'
];

echo "原始数组:\n";
print_r($fruits);

// 添加新元素到开头
$fruits = addToBeginning($fruits, 'grape', 'purple');
echo "添加 grape 后的数组:\n";
print_r($fruits);

// 添加已存在键的元素
$fruits = addToBeginningWithKeyCheck($fruits, 'banana', 'green');
echo "添加已存在的 banana 键后的数组:\n";
print_r($fruits);

// 添加多个元素
$fruits = addMultipleToBeginning($fruits, [
    'kiwi' => 'green',
    'mango' => 'yellow'
]);
echo "添加多个元素后的数组:\n";
print_r($fruits);

// 处理数字键的数组
$numbers = [1 => 'one', 2 => 'two', 3 => 'three'];
echo "原始数字键数组:\n";
print_r($numbers);

$numbers = addToBeginningWithNumericKeys($numbers, 0, 'zero');
echo "添加数字键元素后的数组:\n";
print_r($numbers);

性能比较

对于大型数组,不同方法的性能可能有所不同:

php 复制代码
// 性能测试函数
function testPerformance($arraySize = 10000)
{
    // 创建大型数组
    $largeArray = [];
    for ($i = 0; $i < $arraySize; $i++) {
        $largeArray["key_$i"] = "value_$i";
    }
    
    // 测试方法1:数组联合运算符
    $start = microtime(true);
    $result1 = addToBeginning($largeArray, 'new_key', 'new_value');
    $time1 = microtime(true) - $start;
    
    // 测试方法2:array_merge
    $start = microtime(true);
    $result2 = addToBeginningWithMerge($largeArray, 'new_key', 'new_value');
    $time2 = microtime(true) - $start;
    
    // 测试方法3:array_splice
    $start = microtime(true);
    $result3 = addToBeginningWithSplice($largeArray, 'new_key', 'new_value');
    $time3 = microtime(true) - $start;
    
    echo "数组大小: $arraySize\n";
    echo "数组联合运算符: " . number_format($time1, 6) . " 秒\n";
    echo "array_merge: " . number_format($time2, 6) . " 秒\n";
    echo "array_splice: " . number_format($time3, 6) . " 秒\n";
}

// 运行性能测试
testPerformance(10000);

实际应用场景

php 复制代码
// 场景1:在配置数组中添加默认值
$config = [
    'db_host' => 'localhost',
    'db_name' => 'my_database',
    'db_user' => 'root'
];

// 添加默认配置到开头
$config = addToBeginning($config, 'default_timezone', 'UTC');

// 场景2:在HTTP头信息中添加自定义头
$headers = [
    'Content-Type' => 'application/json',
    'Accept' => 'application/json'
];

// 添加认证头到开头
$headers = addToBeginning($headers, 'Authorization', 'Bearer token123');

// 场景3:在路由表中添加优先路由
$routes = [
    'user/{id}' => 'UserController@show',
    'post/{id}' => 'PostController@show'
];

// 添加首页路由到开头
$routes = addToBeginning($routes, '/', 'HomeController@index');

注意事项

  1. ​键冲突​ ​:如果新元素的键已存在于数组中,使用数组联合运算符 (+) 会保留原始值,而 array_merge会用新值覆盖旧值。

  2. ​数字键​​:对于数字键的数组,添加元素到开头可能会改变键的顺序。如果需要保持数字键的连续性,可能需要额外处理。

  3. ​性能​ ​:对于大型数组,数组联合运算符通常比 array_merge更快,因为它不需要重新索引数组。

  4. ​保持引用​​:这些方法都会创建新数组,不会修改原始数组的引用。

总结

在 PHP 中,将新元素添加到关联数组的开头有多种方法:

  1. 数组联合运算符 (+) :最简单且性能最好

  2. array_merge函数​​:更直观但性能稍差

  3. array_splice函数​​:最灵活但性能最差

根据具体需求选择合适的方法。对于大多数情况,使用数组联合运算符是最佳选择。

相关推荐
两个人的幸福14 小时前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982074 天前
PHP 扩展——从入门到理解
php
鹏仔先生4 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下4 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip4 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒5 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2505 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis5 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel