从数组中删除每个第二个元素并重新排列键?

5
我该如何使用 PHP 内置的数组函数从以下示例数组中删除每个第二个元素:
```php ```
请注意,您需要仅使用内置的数组函数进行操作。
$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh');

当我移除每个第二个元素时,应该得到:

$array = array('first', 'third', 'fifth', 'seventh');

可以的吗?
4个回答

17
$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh');
foreach (range(1, count($array), 2) as $key) {
  unset($array[$key]);
}
$array = array_merge($array);
var_dump($array);
或者
$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh');
$size = count($array);
$result = array();
for ($i = 0; $i < $size; $i += 2) {
  $result[] = $array[$i];
}
var_dump($result);

1
你是最棒的!我会在大约8-10分钟内接受你的答案 ;) - metaforce

3

另一种使用array_intersect_key的方法:

$array  = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh');
$keys   = range(0, count($array), 2);
$result = array_values(array_intersect_key($array, array_combine($keys, $keys)));
var_dump($result);

1

是的,当然可以。

for ($i = 0; $i < count($array); $i++)
{
  if (($i % 2) == 0) unset ($array[$i]);
}

1
这不会重新排列键,并且(根据问题)将删除0、2、4,...,但它们应该保留。应该删除1、3、5,...一个小“事情”:您不应在for测试表达式中使用函数,因为它在任何迭代中都会被调用。此外,它会导致不希望的行为,因为数组的大小会发生变化(在第一个unset()之后,大小不再是$maxKey + 1)。 - KingCrunch
@KingCrunch 我只是在给他举例子。另外,我也同意在for循环测试表达式中使用函数。但再次强调,这只是一个学校例子,他应该如何思考来解决问题。 - Igor Hrcek
这个答案是错误的,正如KingCrunch所说,它会彻底破坏一个数组。请看下面我的回答。 - iautomation
如果在循环中每次都对数组进行“计数”,则每个“for”循环将得到错误的计算值。 - zoore

0

正确的方法是使用反向循环(结合常规模数) 对于任何寻找复制粘贴解决方案的人:

for ($i = count($ar)-1; $i >= 0 ; $i--){ if (($i % 2) == 0) unset ($ar[$i]); }


如果在循环中每次“计算”数组,你将得到错误的计算值。 - zoore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接