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

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

相关推荐
运维闲章印时光5 小时前
网络断网、环路、IP 冲突?VRRP+MSTP+DHCP 联动方案一次性解决
运维·服务器·开发语言·网络·php
板鸭〈小号〉15 小时前
Socket网络编程(1)——Echo Server
开发语言·网络·php
kjl53656621 小时前
Redis配置文件(redis.conf)
redis·bootstrap·php
東雪蓮☆1 天前
LNMP 环境部署 WordPress
linux·运维·mysql·nginx·php
Gary Studio1 天前
ESP32 IDF GET_HTTPS
网络协议·https·php
迎風吹頭髮1 天前
UNIX下C语言编程与实践41-UNIX 单线程 I/O 超时处理:终端方式、信号跳转方式与多路复用方式
c语言·php·unix
心静财富之门1 天前
【无标题】标签单击事件
开发语言·php
weixin_446260852 天前
快速构建网站的利器——Symfony PHP框架
开发语言·php·symfony
朝新_2 天前
【EE初阶 - 网络原理】网络通信
java·开发语言·网络·php·javaee