【问题标题】:Which is the best way to remove middle element of associative array in PHP?在 PHP 中删除关联数组的中间元素的最佳方法是什么?
【发布时间】:2012-04-11 19:03:28
【问题描述】:

请告诉我在 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) { 未设置($temp[$key]); 休息; } $i++; }

上面的代码是有效的方法吗?

【问题讨论】:

  • 偶数数组没有“中间元素”。考虑一个有 4 个元素的数组。有元素 1、2、3 和 4;哪个是中间元素?

标签: php


【解决方案1】:
$temp = Array("name1"=>"value1","name2"=>"value2",...,"name10000"=>"value10000");
$middleElem = ceil(count($temp)/2);
$keys = array_keys($temp);
$middleKey = $keys[$middleElem];
unset($temp[$middleKey]);

那里^_^

【讨论】:

  • 嗯嗯嗯不?不正确...以包含三个项目的数组为例。你认为哪一项会被取消?
  • 我正在调整 OP 的代码以使其达到他们想要的效果。我没有花时间解决所有的错误和故障,那是他们的工作。 (对不起,如果这很粗鲁......)
  • @Kolink WTF。 “我正在调整 OP 的代码,让它做他们想做的事。”。如果它有错误,它显然不会做 OP 想要的......
  • 简而言之:unset($arr[array_keys($arr)[ceil(count($arr)/2)]]);但请记住,这种语法只允许从 php 5.4.x
【解决方案2】:

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

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

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

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

上面的代码选择了'lower'元素,可以很容易地编辑代码来让它选择'higher'元素。您唯一需要检查的是(所有其他答案都未能做到)如果您拥有三个元素会发生什么。它不选择中间元素,而是选择最后一个元素。所以你必须为此添加一个检查。

【讨论】:

    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        首先,我不会太担心目前最有效的方法。如果代码易于阅读、调试和更改,那么编写代码会好得多。像这样的微优化很少能产生很好的结果(因为它们通常不是最大的瓶颈)。

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

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

        【讨论】:

          【解决方案6】:

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

          <?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 中间了。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2010-12-17
              • 2011-04-09
              • 1970-01-01
              • 1970-01-01
              • 2019-09-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多