PHP重置数组为连续数字索引的几种方式

本文介绍了三种在PHP中将不连续索引的数组转换为从0开始连续索引的方法:使用array_values()函数、array_merge()函数以及通过循环遍历实现。重点推荐使用array_values()函数。

比如这样的一个php数组:

$arr = array(
    1 => 'apple',
    3 => 'banana',
    5 => 'orange'
);

想要转换为这样的数组:

$arr = array(
    0 => 'apple',
    1 => 'banana',
    2 => 'orange'
);

1、推荐的方式  array_values 方法

这样方式无论对普通数组还是关联数组都适用


<?php

$arr = array(
    1 => 'apple',
    3 => 'banana',
    5 => 'orange'
);

print_r(array_values($arr));

$arr1 = array(
    'name' => 'jerry',
    'age' => 16,
    'height' => '18cm'
);

print_r(array_values($arr1));


输出结果:


[root@localhost php]# php array.php 
Array
(
    [0] => apple
    [1] => banana
    [2] => orange
)
Array
(
    [0] => jerry
    [1] => 16
    [2] => 18cm
)

2、使用 array_merge 方法

该方法如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。所以只能适用于数字索引

<?php

$arr = array(
    1 => 'apple',
    3 => 'banana',
    5 => 'orange'
);

print_r(array_merge($arr));

$arr1 = array(
    'name' => 'jerry',
    'age' => 16,
    'height' => '18cm'
);

print_r(array_merge($arr1));

输出结果:

[root@localhost php]# php array.php 
Array
(
    [0] => apple
    [1] => banana
    [2] => orange
)
Array
(
    [name] => jerry
    [age] => 16
    [height] => 18cm
)

3、循环遍历

最原始的方式,臃肿且不够优雅,极力抵制。


<?php

function resetArr($arr){
    $temp = array();
    foreach($arr as $v){
        $temp[] = $v;
    }
    return $temp;
}

$arr = array(
    1 => 'apple',
    3 => 'banana',
    5 => 'orange'
);

print_r(resetArr($arr));

$arr1 = array(
    'name' => 'jerry',
    'age' => 16,
    'height' => '18cm'
);

print_r(resetArr($arr1));

That‘s it!



<think> 根据用户的问题,需要在PHP中删除数组中值为2的元素。参考提供的引用资料,有多种方法可以实现。下面将详细介绍几种常见的方法。 ### 方法1: 使用`foreach`循环和`unset`删除 这是最直观的方法,遍历数组,当元素值等于2时,使用`unset`删除该元素。 ```php $array = [1, 2, 3, 2, 4]; foreach ($array as $key => $value) { if ($value === 2) { unset($array[$key]); } } // 重新索引数组(如果希望保持连续数字索引) $array = array_values($array); print_r($array); ``` **注意**:`unset`会保留原来的键名,如果需要重新建立数字索引(从0开始连续),可以使用`array_values()`函数。 ### 方法2: 使用`array_diff()`函数 `array_diff()`函数可以计算数组的差集,返回一个新数组,该数组包含了所有在第一个数组中但不在后续数组中的值。我们可以将值为2的元素作为一个数组传入,然后从原数组中删除这些值。 ```php $array = [1, 2, 3, 2, 4]; $array = array_diff($array, [2]); print_r($array); ``` 这种方法会删除所有值为2的元素,并且不会保留原始键名(会重新索引数组)。 ### 方法3: 使用`array_filter()`函数 `array_filter()`函数通过回调函数过滤数组的元素。我们可以定义一个回调函数,返回元素值不等于2的元素。 ```php $array = [1, 2, 3, 2, 4]; $array = array_filter($array, function($value) { return $value !== 2; }); // 如果需要重新索引数组 $array = array_values($array); print_r($array); ``` 使用`array_filter()`时,默认会过滤掉值为`false`的元素(如`0`, `null`, `false`等),但这里我们明确指定条件,所以不会误删其他值。同样,如果需要连续索引,可以使用`array_values()`。 ### 方法4: 使用`array_merge()`和`array_diff()`组合 在引用[3]中提到了这种方法,实际上与方法2类似,但多了一个合并步骤。此方法在删除多个不同值时可能有用,但删除单个值2时,与方法2效果相同。 ```php $array = [1, 2, 3, 2, 4]; $array = array_merge(array_diff($array, [2])); print_r($array); ``` 这里`array_diff($array, [2])`得到的是差集数组,但键名是原来的,使用`array_merge()`可以重新索引数组。 ### 方法5: 使用循环和`array_splice()` `array_splice()`函数可以删除数组中的一段元素,并重新索引数组。但注意,它要求我们提供要删除元素的键(索引)。由于我们不知道值为2的元素在哪些位置,所以需要结合循环。 ```php $array = [1, 2, 3, 2, 4]; for ($i = count($array) - 1; $i >= 0; $i--) { if ($array[$i] === 2) { array_splice($array, $i, 1); } } print_r($array); ``` 这里从后往前遍历,避免因为删除元素导致索引变化而跳过元素。 ### 总结 - 如果希望保留键名,可以使用`foreach`循环和`unset`,但注意后续可能需要重新索引。 - 如果不需要保留键名,推荐使用`array_diff()`,简洁高效。 - 使用`array_filter()`可以更灵活地定义删除条件(例如多个条件)。 - 避免在循环中使用`array_splice()`,因为它会改变数组结构,导致索引变化,容易出错(除非从后往前遍历)。 根据需求选择合适的方法。通常,使用`array_diff()`或`array_filter()`是较为优雅的方式。 §§相关问题§§ 1. 在PHP中如何删除数组中的多个特定值? 2. 如何删除PHP数组中所有值为空的元素? 3. 在PHP中,`unset`和`array_splice`在删除数组元素时有什么区别? 4. 如何保留数组键名的情况下删除元素? 5. 在PHP中,如何删除关联数组中的特定值元素? </think>### PHP删除数组中值为2的元素的方法 在PHP中删除数组中特定值元素(如值为2)有多种方法,以下是五种常用方法(附代码示例): #### 1. **使用 `foreach` + `unset`(保留原键名)** ```php $arr = [1, 2, 3, 2, 4]; foreach ($arr as $key => $value) { if ($value === 2) { unset($arr[$key]); // 直接删除元素 } } // 输出: [1, 3, 4](键名保持不变) ``` > **注意**:`unset`会保留原始键名,若需连续数字索引,需额外使用 `array_values()` 重新索引[^1][^2]。 --- #### 2. **使用 `array_diff()`(推荐,自动重新索引)** ```php $arr = [1, 2, 3, 2, 4]; $arr = array_diff($arr, [2]); // 删除所有值为2的元素 // 输出: [0=>1, 1=>3, 2=>4](自动重新索引) ``` > **优点**:单行代码,效率高,自动重置数组索引[^3]。 --- #### 3. **使用 `array_filter()`(灵活条件过滤)** ```php $arr = [1, 2, 3, 2, 4]; $arr = array_filter($arr, function($value) { return $value !== 2; // 保留所有不等于2的值 }); // 输出: [1, 3, 4](保留原键名) ``` > **扩展**:支持复杂条件,如同时删除多个值:`return !in_array($value, [2, 5]);` --- #### 4. **`for` 循环 + `array_splice()`(精准删除)** ```php $arr = [1, 2, 3, 2, 4]; for ($i = count($arr) - 1; $i >= 0; $i--) { if ($arr[$i] === 2) { array_splice($arr, $i, 1); // 删除索引$i处的元素 } } // 输出: [1, 3, 4](自动重新索引) ``` > **注意**:必须**从后往前遍历**,避免索引错位[^4]。 --- #### 5. **关联数组删除特定值** ```php $users = [ 'a' => 2, 'b' => 3, 'c' => 2 ]; foreach ($users as $key => $value) { if ($value === 2) { unset($users[$key]); // 删除键值对 } } // 输出: ['b' => 3] ``` ### 总结对比 | 方法 | 是否保留键名 | 重新索引 | 适用场景 | |--------------------|--------------|----------|------------------------| | `foreach + unset` | 是 | 需手动 | 需保留原始键名时 | | `array_diff()` | 否 | 自动 | 简单快速删除单/多值 | | `array_filter()` | 是 | 需手动 | 复杂条件过滤 | | `for + array_splice`| 否 | 自动 | 需精准控制索引时 | > **最佳实践**: > - 普通索引数组 → 优先用 `array_diff()` > - 需保留键名 → 用 `foreach + unset` 或 `array_filter()` > - 关联数组 → 用 `foreach + unset`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值