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

このような再帰関数を使用できます。

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 に答える
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 に答える