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

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

相关推荐
wuyoula5 小时前
旧物回收系统源码 – go语言版
php·源码·源码分享·网站源码·源码大全
w***48827 小时前
网络安全防护指南:筑牢网络安全防线(510)
安全·web安全·php
wuyoula7 小时前
AI面相最新版微信小程序源码
ai·php·编程·php源码·网站源码·ai源码·游戏源码
郑州光合科技余经理10 小时前
开发指南:海外版外卖跑腿系统源码解析与定制
java·开发语言·mysql·spring cloud·uni-app·php·深度优先
HUT_Tyne26512 小时前
阿里云ACP认证
阿里云·云计算·php
Laravel技术社区12 小时前
php 读取视频流(mp4视频文件),快速读取视频解决方案(案例及配置)
开发语言·php·音视频
csdn_aspnet14 小时前
PHP 计算球体的体积和表面积(Calculate Volume and Surface area Of Sphere)
php
PyHaVolask14 小时前
PHP基础入门
开发语言·php
zwm_yy15 小时前
php常用函数
开发语言·php·restful
YUJIANYUE16 小时前
查立得PHP+Mysql影院选座式教室座位预定系统 v1.0
开发语言·mysql·php