计算混合数组php中字符串的次数

时间:2012-12-15 09:09:02

标签: php recursion multidimensional-array

我想要一种简单的方法来计算字符串“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”的次数。建议我最好的。

3 个答案:

答案 0 :(得分:8)

您可以使用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的版本&lt; 5.3,你必须使用对象来封装计数器:

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

答案 1 :(得分:2)

另一个解决方案是平整数组并计算值:

<?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

答案 2 :(得分: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);

希望它有所帮助。