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函数​​:最灵活但性能最差

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

相关推荐
BingoGo11 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack11 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5