这是在PHP中删除关联数组中间元素的最佳方法


Which is the best way to remove middle element of associative array in PHP?

请告诉我在PHP中取消设置关联数组中间元素的最佳方法是什么?

假设我有一个由10000个元素组成的数组,我想删除该数组的中间元素,哪种方法是删除中间元素的有效方法?

$temp=数组('name1'=>'value1','name2'=>'value2',…,'name10000'=>'value10000');$middleElem=ceil(计数($temp)/2);$i=0;foreach($temp为$key=>$val){if($i==$middleElem){unset($temp[$key]);打破}$i++;}

以上代码是有效的方式吗?

考虑到$array是您的数组,如果它有奇数个元素,则此代码将删除中间的元素。如果是它的事件,它将删除两个中间元素中的第一个。

$i = round(count($array)/2) - 1;
$keys = array_keys($array);
unset ($array[$keys[$i]]);

测试结果:http://ideone.com/wFEM2

当你有一个偶数元素的数组时,你必须弄清楚你想做什么。那么你想得到什么元素呢?

上面的代码选择了"lower"元素,可以很容易地编辑代码,使其选择"higher"元素。你唯一需要检查的是(所有其他答案都没有做)如果你有三个要素,会发生什么。事实并非如此;不要选择中间的元素,而是最后一个。所以你必须添加一张支票。

$temp = Array("name1"=>"value1","name2"=>"value2",...,"name10000"=>"value10000");
$middleElem = ceil(count($temp)/2);
$keys = array_keys($temp);
$middleKey = $keys[$middleElem];
unset($temp[$middleKey]);

有^_^

我认为这是一种正确的方法。试试这个:

array_remove_at( $temp, ceil(count($temp) / 2) - 1);
function array_remove_at(&$array, $index){
    if (array_key_exists($index, $array)) {
        array_splice($array, $index, 1);
    }
}

您可以找到数组的大小,将该数字除以2,然后继续移除元素。不确定性能问题,尽管

首先,我不太担心目前最有效的方法是什么。你最好通过编码来了解代码的易读性、调试性和更改性。像这样的微观优化很少能产生好的结果(因为它们通常不是最大的瓶颈)。

话虽如此,如果你想要一个易于阅读的解决方案,那么使用array_splice怎么样。

$temp = array('name1'=>'value1','name2'=>'value2',...,'name10000'=>'value10000');
$middleElem = ceil(count($temp) / 2);
array_splice( $temp, $middleElem, 1 );

我认为下面的代码更高效,因为您不必在循环中执行它。我通常遵循与Kolink相同的模式,但我的版本检查是否真的是一个"中间元素"。我认为它适用于所有类型的数组。

<?php
for( $i = 0; $i <= 9; $i ++ ) {
    $temp['name'.$i] = 'value'.$i;
}
if( ( $count = count( $temp ) ) % 2 === 0 ) {
    /** Only on uneven arrays. */
    array_splice( $temp, ( ceil( $count ) / 2 ), 1 );
}
var_dump( $temp );

编辑:Thavarith似乎是对的;array_splice比简单地取消设置值快得多。此外,您还可以获得不必使用array_keys的额外好处,因为您现在已经了解了中间的$offset

正确的方法似乎是:

unset(arr[id]);
arr = array_values(arr);

用于首先移除索引id处的元素,然后适当地重新索引阵列arr

unset($myArray[key])由于数组是关联的,因此可以通过这种方式轻松地删除任何元素