5

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

4

3 回答 3

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) { .. }是一个匿名函数声明;它就像一个普通函数一样工作,但是你可以通过使用use ($var)或者use (&$var)如果你也需要修改它来从父作用域继承变量。更多示例可以在手册页上找到。

更新

对于 PHP < 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
于 2012-12-15T09:17:04.773 回答
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
于 2012-12-15T09:39:34.283 回答
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);

希望能帮助到你。

于 2012-12-15T09:55:08.693 回答