请告诉我在PHP中取消设置关联数组的中间元素的最佳方法是什么?
假设我有一个包含10,000个元素的数组,并且我想删除该数组的中间元素,这是删除中间元素的有效方法吗?
$temp = array('name1'=>'value1','name2'=>'value2',...,'name10000'=>'value10000'); $middleElem = ceil(count($temp) / 2); $i = 0; foreach ($temp as $key=>$val) { if ($i == $middleElem) { unset($temp[$key]); break; } $i++; }
以上代码是否有效?
答案 0 :(得分:5)
$temp = Array("name1"=>"value1","name2"=>"value2",...,"name10000"=>"value10000");
$middleElem = ceil(count($temp)/2);
$keys = array_keys($temp);
$middleKey = $keys[$middleElem];
unset($temp[$middleKey]);
有^ _ ^
答案 1 :(得分:5)
考虑$array
是您的数组,如果中间元素具有奇数个元素,则此代码将删除它。如果它的事件它将删除 2个中间元素中的第一个。
$i = round(count($array)/2) - 1;
$keys = array_keys($array);
unset ($array[$keys[$i]]);
测试结果: http://ideone.com/wFEM2
当你拥有一个包含偶数元素的数组时,你需要弄清楚的是你想要做的事情。你想要得到什么元素?
上面的代码选择'lower'元素,代码可以很容易地编辑,使它选择'更高'元素。你唯一需要检查的是(所有其他答案都没有做到)如果你有三个元素会发生什么。它没有选择中间元素,但是最后一个。所以你必须为此添加一个支票。
答案 2 :(得分:3)
我认为这是一种正确的方法。试试这个:
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);
}
}
答案 3 :(得分:2)
您可以找到数组的大小,将该数字除以2,然后继续删除该元素。虽然
,但不确定性能是否如此答案 4 :(得分:1)
首先,我不会过分担心此时最有效的方式。编写代码读取,调试和更改的容易程度要好得多。像这样的微观优化很少产生很好的结果(因为它们通常不是最大的瓶颈)。
话虽如此,如果您想要一个易于阅读的解决方案,那么如何使用array_splice。
$temp = array('name1'=>'value1','name2'=>'value2',...,'name10000'=>'value10000');
$middleElem = ceil(count($temp) / 2);
array_splice( $temp, $middleElem, 1 );
答案 5 :(得分:0)
我认为以下代码更有效,因为您不必在循环中执行它。我通常遵循与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
中间位置。
答案 6 :(得分:-1)
未设置($ myArray的[键]) 由于您的数组是关联的,因此可以通过这种方式轻松删除任何元素