array_slice()是PHP中提取子数组的核心函数,通过offset和length参数灵活控制起始位置和长度,支持负值以从末尾计算,结合preserve_keys参数可选择是否保留原键名,适用于非破坏性提取;而array_splice()会修改原数组,适用于删除或插入操作,处理关联数组时应设preserve_keys为true以保持键名不变。

在PHP中从数组中提取子数组,最直接也是最常用的方法就是利用
array_slice()
array_slice()
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
让我来拆解一下这些参数:
立即学习“PHP免费学习笔记(深入)”;
$array
$offset
-1
-2
$length
$offset
$offset
$length
null
$offset
$preserve_keys
false
false
0
true
看个例子吧:
<?php $originalArray = ['a', 'b', 'c', 'd', 'e', 'f']; // 从索引2开始,取3个元素 $subArray1 = array_slice($originalArray, 2, 3); print_r($subArray1); // 输出: Array ( [0] => c [1] => d [2] => e ) // 从倒数第3个元素开始,取2个元素 $subArray2 = array_slice($originalArray, -3, 2); print_r($subArray2); // 输出: Array ( [0] => d [1] => e ) // 从索引1开始,一直取到数组末尾 $subArray3 = array_slice($originalArray, 1); print_r($subArray3); // 输出: Array ( [0] => b [1] => c [2] => d [3] => e [4] => f ) // 从索引1开始,但保留原始键 $subArray4 = array_slice($originalArray, 1, null, true); print_r($subArray4); // 输出: Array ( [1] => b [2] => c [3] => d [4] => e [5] => f ) ?>
array_slice()
offset
length
offset
length
array_slice()
首先是
offset
offset
array_slice($arr, 2)
offset
offset = -1
-2
接着是
length
length
array_slice($arr, 2, 3)
length
length
array_slice($arr, 0, -2)
length
null
offset
来看几个具体的例子,你就能明白我的意思了:
<?php $data = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']; // 案例1: 正数 offset, 正数 length // 从索引 1 (banana) 开始,取 3 个元素 $slice1 = array_slice($data, 1, 3); print_r($slice1); // 输出: Array ( [0] => banana [1] => cherry [2] => date ) // 案例2: 负数 offset, 正数 length // 从倒数第 2 个元素 (elderberry) 开始,取 2 个元素 $slice2 = array_slice($data, -2, 2); print_r($slice2); // 输出: Array ( [0] => elderberry [1] => fig ) // 案例3: 正数 offset, 负数 length // 从索引 0 (apple) 开始,但排除最后 3 个元素 (date, elderberry, fig) $slice3 = array_slice($data, 0, -3); print_r($slice3); // 输出: Array ( [0] => apple [1] => banana [2] => cherry ) // 案例4: 负数 offset, 负数 length // 从倒数第 4 个元素 (cherry) 开始,但排除最后 1 个元素 (fig) $slice4 = array_slice($data, -4, -1); print_r($slice4); // 输出: Array ( [0] => cherry [1] => date [2] => elderberry ) // 案例5: offset, length 为 null (或省略) // 从索引 2 (cherry) 开始,一直到数组末尾 $slice5 = array_slice($data, 2); print_r($slice5); // 输出: Array ( [0] => cherry [1] => date [2] => elderberry [3] => fig ) ?>
通过这些例子,你会发现
offset
length
array_slice()
array_splice()
这是一个非常经典的PHP数组函数辨析问题,我个人在初学时也曾混淆过。说白了,它们的主要区别在于是否会修改原始数组。理解这一点,就能清晰地知道何时该用哪个。
array_slice()
而
array_splice()
array_splice()
何时选用 array_slice()
何时选用 array_splice()
来看个对比:
<?php $listA = ['item1', 'item2', 'item3', 'item4', 'item5']; $listB = ['item1', 'item2', 'item3', 'item4', 'item5']; // 使用 array_slice() echo "--- 使用 array_slice() ---\n"; $extractedItems = array_slice($listA, 1, 3); print_r($extractedItems); // 输出: Array ( [0] => item2 [1] => item3 [2] => item4 ) print_r($listA); // 原始数组未变 // 输出: Array ( [0] => item1 [1] => item2 [2] => item3 [3] => item4 [4] => item5 ) echo "\n--- 使用 array_splice() ---\n"; // 从索引1开始,移除3个元素 $removedItems = array_splice($listB, 1, 3); print_r($removedItems); // 输出: Array ( [0] => item2 [1] => item3 [2] => item4 ) print_r($listB); // 原始数组已被修改 // 输出: Array ( [0] => item1 [1] => item5 ) // array_splice() 还可以插入 array_splice($listB, 1, 0, ['newItemA', 'newItemB']); // 在索引1处插入两个新元素,不移除任何旧元素 print_r($listB); // 输出: Array ( [0] => item1 [1] => newItemA [2] => newItemB [3] => item5 ) ?>
通过这个对比,应该很清楚了:如果你想“看”数组的一部分而不动它,用
array_slice()
array_splice()
array_slice()
preserve_keys
当我们在处理关联数组时,
array_slice()
preserve_keys
默认情况下,
preserve_keys
false
0
举个例子,你有一个用户信息数组,键是用户的ID或者属性名:
<?php
$userProfile = [
'id' => 101,
'username' => 'john.doe',
'email' => 'john@example.com',
'status' => 'active',
'last_login' => '2023-10-26'
];
// 尝试提取部分信息,不保留键(默认行为)
$partialProfileDefault = array_slice($userProfile, 1, 2);
print_r($partialProfileDefault);
// 输出:
// Array
// (
// [0] => john.doe
// [1] => john@example.com
// )
echo "尝试访问原始键名:\n";
echo "Username: " . ($partialProfileDefault['username'] ?? 'N/A') . "\n"; // 会是N/A
echo "Email: " . ($partialProfileDefault['email'] ?? 'N/A') . "\n"; // 会是N/A
echo "第一个元素: " . $partialProfileDefault[0] . "\n"; // 输出: Username: john.doe
?>你看,
username
0
1
username
而当你将
preserve_keys
true
array_slice()
<?php
$userProfile = [
'id' => 101,
'username' => 'john.doe',
'email' => 'john@example.com',
'status' => 'active',
'last_login' => '2023-10-26'
];
// 提取部分信息,保留键
$partialProfilePreserved = array_slice($userProfile, 1, 2, true);
print_r($partialProfilePreserved);
// 输出:
// Array
// (
// [username] => john.doe
// [email] => john@example.com
// )
echo "尝试访问原始键名:\n";
echo "Username: " . ($partialProfilePreserved['username'] ?? 'N/A') . "\n"; // 输出: john.doe
echo "Email: " . ($partialProfilePreserved['email'] ?? 'N/A') . "\n"; // 输出: john@example.com
?>这下就对了!
username
所以,我的建议是,当你处理关联数组时,几乎总是应该将
preserve_keys
true
以上就是如何在PHP中从数组中提取子数组?array_slice()函数的用法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号