【问题标题】:Count number of times a string in mixed array php计算混合数组php中字符串的次数
【发布时间】:2023-03-13 19:24:01
【问题描述】:

我想要一种简单的方法来计算字符串“Apple”在给定中出现的次数

# My Array  :

$arr = array(
             1 => "Apple",
             2 => "Orange",
             3 => array(1=>"Bananna",2=>"Apple"),
             4 => "Grape",
             5 => "Apple",
             6 => array(1=>"Grape"),
             7 => "Orange");

# Want to count only "Apple"

$needle         = "Apple";

# My Function :

 function arrsearch($needle,$haystack,$return) {
    if(!is_array($haystack)) {
      return false;
    } 
    foreach($haystack as $key=>$val) {
        if(is_array($val)) {
              $return     = arrsearch($needle,$val,$return);
        }else if(strtolower($val) == strtolower($needle)) {
          $return[] = $key;
        }
    }
    return $return;
 }

 $var = arrsearch("Apple",$arr,array());
 echo " Output : ".count($var);

 # Output : 3

我使用上面的函数来查找字符串“Apple”在数组中的次数。给我推荐一个最好的。

【问题讨论】:

    标签: php recursion multidimensional-array


    【解决方案1】:

    你可以使用array_walk_recursive:

    function search_for($arr, $term)
    {
        $count = 0;
    
        array_walk_recursive($arr, function($item, $idx, $term) use (&$count) {
          if (false !== stripos($item, $term)) {
              ++$count;
          }
        }, $term);
    
        return $count;
    }
    
    search_for($arr, 'Apple'); // returns 3
    

    表达式function($item, $idx, $term) use (&$count) { .. } 是一个anonymous function 声明;它就像一个常规函数一样工作,但是如果您也需要修改它,您可以使用use ($var)use (&$var) 从父范围继承变量。更多示例可以在手册页上找到。

    更新

    对于 PHP

    class RecursiveArraySearcher
    {
        private $c = 0;
    
        public static function find($arr, $term)
        {
            $obj = new self;
    
            array_walk_recursive($arr, array($obj, 'ismatch'), $term);
    
            return $obj->c;
        }
    
        public function ismatch($item, $key, $term)
        {
            if (false !== stripos($item, $term)) {
                ++$this->c;
            }
        }
    }
    
    echo RecursiveArraySearcher::find($arr, 'Apple'); // 3
    

    【讨论】:

    • 哇,你能发布一个链接来解释use 表达式吗?
    • @JanTuroň 当然,我已经更新了我的答案来解释匿名函数的使用。
    【解决方案2】:

    你可以使用这样的递归函数..

    function finditem($item,$array){
        $count = 0;
        foreach($array as $key => $value){
            if(is_array($value) == true){
                $countx = finditem($item,$value);
                $count = $count + $countx;
            }else if($value == $item)
                $count++;
        }
        return $count;
    }
    
    echo finditem("Apple",$arr);
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      另一种解决方案是将数组展平并计算值:

      <?php
      
      function search_for($arr, $term) {
        $flatten_array = array();
        $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
        foreach($it as $v) {
          $flatten_array[] = $v;
        }
      
        $count_values = array_count_values($flatten_array);
        return $count_values[$term];
      }
      
      echo search_for($arr, 'Apple'); // print 3
      

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 2014-04-24
        相关资源
        最近更新 更多