【问题标题】:Filter array - odd even过滤器数组 - 奇偶
【发布时间】:2009-04-10 16:31:42
【问题描述】:

如何过滤掉索引号为奇数或偶数的数组条目?

Array
(
    [0] => string1
    [1] => string2
    [2] => string3
    [3] => string4
)

就像,我希望它从数组中删除 [0] 和 [2] 条目。 或者说我有 0,1,2,3,4,5,6,7,8,9 - 我需要删除 0,2,4,6,8。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    foreach($arr as $key => $value) if($key&1) unset($arr[$key]);

    上面从数组中删除奇数位置,要删除偶数位置,使用以下:

    您可以使用if(!($key&1)) 而不是if($key&1)

    【讨论】:

    • 这会删除每个奇数,例如 [1] 和 [3]。如何删除每个偶数,例如 [0]、[2]...?
    • 只需将 Thinker 代码中的 if 语句更改为 (!$key&1) ... foreach($arr as $key => $value) if(!$key&1) unset($arr[$key ]);
    • 我也是这么想的,但是它给了我[1],[2],[3],而不是[4],它应该只给我[1]和[3]。有什么想法吗?
    • 如果 !$key&1 不起作用,那是因为运算符优先级。我编辑了我的代码。
    • if($key&1) 中“&”实际上在做什么......以及它如何知道它是奇数还是偶数
    【解决方案2】:

    这是一个“hax”解决方案:

    将 array_filter 与“isodd”函数结合使用。

    array_filter 似乎只对值起作用,所以你可以先 array_flip 然后使用 array_filter。

    array_flip(array_filter(array_flip($data), create_function('$a','return $a%2;')))
    

    【讨论】:

    • create_function 不推荐使用,因为它有内存泄漏。
    • 而且它们也很难阅读 :) 当 5.3.0 发布时,匿名函数值得一看 (uk2.php.net/manual/en/functions.anonymous.php)
    • 很棒的匿名函数!不知道他们是计划好的,谢谢
    【解决方案3】:

    您也可以像这样使用 SPL FilterIterator:

    class IndexFilter extends FilterIterator {
        public function __construct (array $data) {
            parent::__construct(new ArrayIterator($data));
        }   
    
        public function accept () {
            # return even keys only
            return !($this->key() % 2);
        }     
    }
    
    $arr      = array('string1', 'string2', 'string3', 'string4');
    $filtered = array();
    
    foreach (new IndexFilter($arr) as $key => $value) {
        $filtered[$key] = $value;
    }
    
    print_r($filtered);
    

    【讨论】:

      【解决方案4】:
      <?php
      function odd($var)
      {
          // returns whether the input integer is odd
          return($var & 1);
      }
      
      function even($var)
      {
          // returns whether the input integer is even
          return(!($var & 1));
      }
      
      $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
      $array2 = array(6, 7, 8, 9, 10, 11, 12);
      
      echo "Odd :\n";
      print_r(array_filter($array1, "odd"));
      echo "Even:\n";
      print_r(array_filter($array2, "even"));
      ?>
      
      Odd :
      Array
      (
          [a] => 1
          [c] => 3
          [e] => 5
      )
      Even:
      Array
      (
          [0] => 6
          [2] => 8
          [4] => 10
          [6] => 12
      )
      

      【讨论】:

        【解决方案5】:

        我会这样做......

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

        【讨论】:

        • 我认为应该是
        【解决方案6】:
        <?php 
        $array = array(0, 3, 5, 7, 20, 10, 99,21, 14, 23, 46); 
        for ($i = 0; $i < count($array); $i++) 
        
        { 
                if ($array[$i]%2 !=0)
                echo $array[$i]."<br>";
        }
        ?> 
        

        【讨论】:

          【解决方案7】:
          $array = array(0 => 'string1', 1 => 'string2', 2 => 'string3', 3 => 'string4');
          
          // Removes elements of even-numbered keys
          $test1 = array_filter($array, function($key) {
              return ($key & 1);
          }, ARRAY_FILTER_USE_KEY);
          
          // Removes elements of odd-numbered-keys
          $test2 = array_filter($array, function($key) {
              return !($key & 1);
          }, ARRAY_FILTER_USE_KEY);
          

          这个答案比this 答案有点改进。您可以使用匿名函数代替create_function。此外,array_filter 采用可选标志参数,可让您指定回调函数将键作为其唯一参数。所以你不需要使用array_flip 来获取一个键数组。

          【讨论】:

            猜你喜欢
            • 2021-05-20
            • 1970-01-01
            • 2021-12-18
            • 2012-06-18
            • 2021-08-11
            • 1970-01-01
            • 2017-05-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多