3

2 つの単純な配列を考えてみましょう。

<?php
  $array1 = array(
    'blue' => 5,

    'green' => array(
      'square' => 10,
      'sphere' => 0.5,
      'triangle' => 3
    ),

    'red' => array(
      'circle' => 1000,
    ),

    'black' => 4,

  );

  $array2 = array(
    'blue' => 1,

    'green' => array(
       'square' => 11,
       'circle' => 5,
    ),

    'purple' => 10,

    'yellow' => array(
      'triangle' => 4
    ),

    'black' => array(
      'circle' => 6,
    ),

  );

各との各値を再帰的に数学的に加算する必要があります。$array1$array2

  • キーを保持する
  • キーが に存在しないが に$array1存在する$array2場合、最終的な配列には単に の値が含まれます$array2(その逆も同様です)。
  • 両方に存在する場合、数値が追加されます+
  • 数値以外の値は変更されません
  • 上の値$array1が別のサブ配列を$array2指し、その中の値を指している場合、終了値は$array1、親の名前とその値を使用して、からの値と新しいキー/値を含むサブ配列を含むキーになります (black例では)
  • 事実上無制限のネスティングで動作できるはずです

明確にするために、例えば、私たちが言った場合

<?php 
  $final = array_merge_special($array1, $array2);

  // We would end up with, if you var_export()'d final, something like:
  // (Note: Hope I didn't make mistakes in this or it will be confusing,
  // so expect mild human error)

  $final = array(
    'blue' => 6, // 5+1

    'green' => array(
      'square' => 21, // (10+11)
      'sphere' => 0.5, // only in $array1
      'triangle' => 3 // only in $array1
      'circle' => 5, // only in $array2
    ),

    'purple' => 10, // only in $array2

    'yellow' => array( // only in $array2
      'triangle' => 4
    ),

    'red' => array( // only in $array1
      'circle' => 1000,
    ),

    'black' => array(
      'circle' => 6, // untouched, while $black is present in both, the $array1 value does not have a 'circle' key, and is actually only a key/value (see below)
      'black' => 4, // the key/value from $array1 that was not a subarray, even though it was a subarray in $array2
    ),

  );

これはとてつもなく気が遠くなるような気がします。1 つの配列をループして値を簡単に再帰的に追加できることはわかっていますが、これは (ある程度) 機能していblackますが、壊れたコードがどのようになるか想像さえできない特別なルール ( のルールなど)に入ったときです。見る。これを行うには、各配列を個別にループしてunset()値をマージする方法が必要ですか?

4

1 に答える 1

1

array_walk_recursive(ここのphpマニュアルを参照)と、場合によってはarray_merge_recursiveを使用します。全体像をつかむには、さらに考え抜かなければなりません。

OK、これはうまくいかないと決めました!Array_walk_recursiveは、配列を保持するキーを関数に渡しません。この問題は私の脳の中で流れ続けていたので、私はそれを行うための関数を書かなければなりませんでした!ここにあります:

function dosum($arin) {
  $arout = array();
  foreach ($arin as $key1 => $item1) {
    $total = 0;
    if(is_array($item1)) {
      foreach($item1 as $key2 => $item2) {
        if(is_numeric($key2))
          $total += $item2;
        else
          if(is_array($item2))
            $arout[$key1] = dosum(array($key2 => $item2));
          else
            $arout[$key1][$key2] =$item2;
      }
      if($total)
        if(isset($arout[$key1]))
          $arout[$key1][$key1] = $total;
        else
          $arout[$key1] = $total;
      }
    else
      $arout[$key1] = $item1;    
    }
  return $arout;
  }

与えられた2つのアレイの場合、次のように使用します。

print_r(dosum(array_merge_recursive($array1, $array2)));
于 2013-03-07T15:48:26.600 に答える