【问题标题】:How to filter a two dimensional array by value如何按值过滤二维数组
【发布时间】:2015-02-11 10:00:15
【问题描述】:

如何创建一个按值过滤二维数组的函数?

给定以下数组:

Array
(
    [0] => Array
        (
            [interval] => 2014-10-26
            [leads] => 0
            [name] => CarEnquiry
            [status] => NEW
            [appointment] => 0
        )

    [1] => Array
        (
            [interval] => 2014-10-26
            [leads] => 0
            [name] => CarEnquiry
            [status] => CALL1
            [appointment] => 0
        )

    [2] => Array
        (
            [interval] => 2014-10-26
            [leads] => 0
            [name] => Finance
            [status] => CALL2
            [appointment] => 0
        )

    [3] => Array
        (
            [interval] => 2014-10-26
            [leads] => 0
            [name] => Partex
            [status] => CALL3
            [appointment] => 0
        )

如何过滤数组以仅显示那些在 name 键中包含特定值的数组?例如name = 'CarEnquiry'

结果输出将是:

Array
(
    [0] => Array
        (
            [interval] => 2014-10-26
            [leads] => 0
            [name] => CarEnquiry
            [status] => NEW
            [appointment] => 0
        )

    [1] => Array
        (
            [interval] => 2014-10-26
            [leads] => 0
            [name] => CarEnquiry
            [status] => CALL1
            [appointment] => 0
        )

    )

编辑

我忘了提到搜索值应该是可互换的——即name = 'CarEnquiry'name = 'Finance'

【问题讨论】:

标签: php arrays


【解决方案1】:

以上示例均使用精确词匹配,这里是过滤数组以查找不精确“名称”匹配的简单示例。

  $options = array_filter($options, function ($option) use ($name) {
    return strpos(strtolower($option['text']), strtolower($name)) !== FALSE;
  });

【讨论】:

    【解决方案2】:

    如果你想让它成为一个通用函数,使用这个:

    function filterArrayByKeyValue($array, $key, $keyValue)
    {
        return array_filter($array, function($value) use ($key, $keyValue) {
           return $value[$key] == $keyValue; 
        });
    }
    

    【讨论】:

      【解决方案3】:
      function multi_array_search_with_condition($array, $condition)
      {
          $foundItems = array();
      
          foreach($array as $item)
          {
              $find = TRUE;
              foreach($condition as $key => $value)
              {
                  if(isset($item[$key]) && $item[$key] == $value)
                  {
                      $find = TRUE;
                  } else {
                      $find = FALSE;
                  }
              }
              if($find)
              {
                  array_push($foundItems, $item);
              }
          }
          return $foundItems;
      }
      

      这个我的函数可以用来解决这个问题。您可以使用:

      $filtered = multi_array_search_with_condition(
         $array,
         array('name' => 'CarEnquiry')
      );
      

      这将从二维数组中获取过滤后的项目。

      【讨论】:

      • 为什么要使用临时的true / false 声明?我不会推荐这种冗长的解决方案。 (要包含的好作品是break
      【解决方案4】:

      使用带有回调的 PHP 的 array_filter 函数。

      $new = array_filter($arr, function ($var) {
          return ($var['name'] == 'CarEnquiry');
      });
      

      编辑:如果需要互换,可以稍微修改一下代码:

      $filterBy = 'CarEnquiry'; // or Finance etc.
      
      $new = array_filter($arr, function ($var) use ($filterBy) {
          return ($var['name'] == $filterBy);
      });
      

      【讨论】:

      • @Tobias 是的,你可以做到。 $new = array_filter($arr, function ($var) use ( $filterBy1, $filterBy2 ) { return ($var['name'] == $filterBy1 || $var['name'] == $filterBy2 ) });
      • 重新索引(从 0 开始):$new = array_values(array_filter($arr, function ($var) { return ($var['name'] == 'CarEnquiry'); }));
      【解决方案5】:
      <?php
      
      
      
          function filter_array($array,$term){
              $matches = array();
              foreach($array as $a){
                  if($a['name'] == $term)
                      $matches[]=$a;
              }
              return $matches;
          }
      
          $new_array = filter_array($your_array,'CarEnquiry');
      
      ?>
      

      【讨论】:

        【解决方案6】:

        array_filter 是您需要的功能。 http://php.net/manual/en/function.array-filter.php

        给它一个像这样的过滤功能:

        function my_filter($elt) {
            return $elt['name'] == 'something';
        }
        

        【讨论】:

          猜你喜欢
          • 2021-03-07
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 2013-06-23
          • 2010-12-08
          • 2016-12-19
          • 2011-11-12
          相关资源
          最近更新 更多