1

次の配列を生成するforeachがあります。

==== array 1 ====
array
  0 => 
    array
      'tag' => string 'daf' (length=3)
  1 => 
    array
      'tag' => string 'daa' (length=3)
  2 => 
    array
      'tag' => string 'daf' (length=3)
  3 => 
    array
      'tag' => string 'daaa' (length=4)
  4 => 
    array
      'tag' => string 'daf' (length=3)
  5 => 
    array
      'tag' => string 'daa' (length=3)
  6 => 
    array
      'tag' => string 'daf' (length=3)
  7 => 
    array
      'tag' => string 'daf' (length=3)
  8 => 
    array
      'tag' => string 'daf' (length=3)
  9 => 
    array
      'tag' => string 'abd' (length=3)
  10 => 
    array
      'tag' => string 'abdaa' (length=5)
  11 => 
    array
      'tag' => string 'abda' (length=4)

==== array 2 ====    
array
  0 => 
    array
      'tag' => string 'daf' (length=3)
  1 => 
    array
      'tag' => string 'test1' (length=5)

出力として、次のようなものを取得したいと思います。

array
  'daf' => '7'
  'daa' => '2'
  'daaa' => '1'
  'abd' => '1'
  'abdaa' => '1'
  'abda' => '1'
  'test1' => '1'

新しい配列の値は、ループから生成されたすべてのarayからの要素の数です。array_count_values()はここでは機能しません...何か提案、問題を解決する方法は?

4

3 に答える 3

4

2次元配列だと気づかなかった。

これが別のコードです。

var_export(
    array_count_values(
        call_user_func_array('array_merge', array_merge($array1, $array2))
    )
);
于 2009-08-19T12:57:09.500 に答える
2

このようなものが機能するはずです:

$result = array();
foreach (array_merge($array1, $array2) as $item) {
    $name = $item['tag'];   
    if (!isset($result[$name])) {
        $result[$name] = 0;   
    } 

    $result[$name]++;
}
于 2009-08-19T12:56:42.260 に答える
2

標準PHPライブラリ(SPL)を利用してみましょう。RecursiveArrayIteratorおよびRecursiveIteratorIterator
を使用して配列を「フラット化」できます。その結果、n次元配列の各リーフにアクセスするイテレータを取得し、それでも要素の実際のキーにアクセスできます。次のステップでは、両方のRecursiveIteratorIteratorを、すべての内部(追加)イテレーターの各要素にアクセスする単一のインターレーターのように機能するAppendIteratorと連結します。

$ai = new AppendIterator;
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array1)));
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array2)));
$counters = array();
foreach($ai as $key=>$value) {
  if ( 'tag'===$key ) {
    // @ because I don't care whether this array element exists beforehand or not.
    // $value has to be something that can be used as an array key (strings in this case)
    @$counters[$value] += 1;
  }
}

必要に応じて、の代わりにFilterIteratorを使用することもできますif('tag'===$key)。しかし、これはコードの可読性/価値を向上させません;-)

于 2009-08-19T13:42:05.787 に答える