我想从数组中取消设置每个第二项。我不关心密钥是否重新排序。
当然,我希望它快速而优雅。是否可能没有循环和临时变量?
答案 0 :(得分:0)
到目前为止我自己的解决方案:
for ( $i = 1; isset($arr[$i]); $i += 2) {
unset($arr[$i]);
}
专业人士认为,它不需要if语句,即变量($i
)仍然需要,并且仅当键是数字且无间隙时才有效。
答案 1 :(得分:0)
如果您有像
这样的数组Array
(
[0] => test1
[1] => test2
[2] => test3
[3] => test4
[4] => test5
)
然后你可以使用下面的代码。它将删除每个第二项数组。
$i = 1;
foreach ($demo_array as $key => $row) {
if($i%2 == '0')
{
unset($demo_array[$key]);
}
$i++;
}
希望这会对你有所帮助。如果您需要任何进一步的帮助,请告诉我们。
答案 2 :(得分:0)
function arr_unset_sec(&$arr, $key)
{
if($key%2 == 0)
{
unset($arr[$key]);
}
}
array_walk($arr, 'arr_unset_sec');
假设$ arr可能是某个阵列。检查这段代码。
答案 3 :(得分:0)
没有循环的另一种解决方案:
$arr = array('a', 'b', 'c', 'd', 'e');
$arr = array_filter( $arr, function($k) { return $k % 3 === 0; }, ARRAY_FILTER_USE_KEY);
亲,它不需要循环。缺点,它比我的其他版本(使用for循环)慢很多,看起来有点可怕,并且再次依赖于键。
答案 4 :(得分:0)
我将提供两种方法(array_filter()
和一个foreach()
循环),它们将利用条件$i++%$n
来定位要删除的元素。
这两种方法都适用于索引和关联数组。
$i++
这是后增量。实际上,将首先评估该值,然后再增加该值。%
这是模运算符 - 它返回"余数"来自右侧值的左侧值的划分。0
或正整数。出于这个原因,php的固有"类型杂耍"功能可用于将0
转换为false
,将正整数转换为true
。array_filter()
方法中,use()
语法必须使用&$i
,以便变量为"可修改"。如果没有&
,$i
将保持不变(不受后期增量影响)。foreach()
方法中,与!()
方法相比,条件被反转array_filter()
。 array_filter()
想要了解"保持&#34 ;; foreach()
想要了解unset()
。代码:(Demo)
// if:$n=2 $n=3 $n=4 $n=5
$array=['first'=>1,
2, // remove
'third'=>3, // remove
'fourth'=>4, // remove remove
5, // remove
6, // remove remove
'seventh'=>7,
'eighth'=>8, // remove remove
'ninth'=>9]; // remove
// if $n is 0 then don't call anything, because you aren't attempting to remove anything
// if $n is 1 then you are attempting to remove every element, just re-declare as $array=[]
for($n=2; $n<5; ++$n){
$i=1; // set counter
echo "Results when filtering every $n elements: ";
var_export(array_filter($array,function()use($n,&$i){return $i++%$n;}));
echo "\n---\n";
}
echo "\n\n";
// Using a foreach loop will be technically faster (only by a small margin) but less intuitive compared to
// the literal/immediate interpretation of "array_filter".
for($n=2; $n<5; ++$n){
$i=1;
$copy=$array;
foreach($copy as $k=>$v){
if(!($i++%$n)) unset($copy[$k]); // or $i++%$n==0 or $i++%$n<1
}
echo "Results when unsetting every $n elements: ";
var_export($copy);
echo "\n---\n";
}
输出:
Results when filtering every 2 elements: array (
'first' => 1,
'third' => 3,
1 => 5,
'seventh' => 7,
'ninth' => 9,
)
---
Results when filtering every 3 elements: array (
'first' => 1,
0 => 2,
'fourth' => 4,
1 => 5,
'seventh' => 7,
'eighth' => 8,
)
---
Results when filtering every 4 elements: array (
'first' => 1,
0 => 2,
'third' => 3,
1 => 5,
2 => 6,
'seventh' => 7,
'ninth' => 9,
)
---
Results when unsetting every 2 elements: array (
'first' => 1,
'third' => 3,
1 => 5,
'seventh' => 7,
'ninth' => 9,
)
---
Results when unsetting every 3 elements: array (
'first' => 1,
0 => 2,
'fourth' => 4,
1 => 5,
'seventh' => 7,
'eighth' => 8,
)
---
Results when unsetting every 4 elements: array (
'first' => 1,
0 => 2,
'third' => 3,
1 => 5,
2 => 6,
'seventh' => 7,
'ninth' => 9,
)
---
答案 5 :(得分:0)
EOF
我认为这也将完美。