-1

重複排除する必要があるかなり単純な多次元配列があります。また、値を持つキーをすべて削除する必要があるため、以下のコードでは、city/Paris の 2 番目のターゲット/値 (配列 3) を保持し、6 番目の配列も削除する必要があります。

配列
(
    [0] => 配列
        (
            [ターゲット] => 都市
            [値] => ロンドン
        )

    [1] => 配列
        (
            [ターゲット] => 色
            [値] => 赤
        )

    [3] => 配列
        (
            [ターゲット] => 都市
            [値] => パリ
        )

    [4] => 配列
        (
            [ターゲット] => タイプ
            [値] => 家
        )

    [6] => 配列
        (
            [ターゲット] => 名前
            [値] =>
        )

    [7] => 配列
        (
            [ターゲット] => メール
            [値] => mail@gmail.com
        )

    [9] => 配列
        (
            [ターゲット] => カスタム 2
            [値] => パス/宛先/何か
        )

)

私はこれを行うことができます:

  • 配列のフラット化
  • ターゲット/値を新しいキー/値として割り当てる (これにより、重複がある場合、後の値が自動的に上書きされます)
  • の値を持つすべてのキーを削除します。
  • アレイを再構築する

これは間違っているように感じます。array_walk_recursive() を使用したより良い解決策があると確信しています。これはおそらく元のキーを保持し、より洗練された解決策になるからです。

これは私の現在のコードです:

function _clean_and_dedupe_targeting($array) {
  // First flatten the array.
  $flattenned = array();
  foreach ($array as $item) {
    foreach ($item as $value) {
      $flattenned[] = $value;
    }
  }

  // Take alternate items as key/value pairs.
  // THIS WILL OVERWRITE ANY DUPLICATES LEAVING THE ONE SET IN CONTEXT IN PLACE.
  $keyval = array();
  array_unshift($flatenned, false);
  while (false !== $key = next($flattenned)) {
    $keyval[$key] = next($flattenned);
  }

  // Remove any items with <REMOVE>
  $remove_string = '<REMOVE>';
  $remove_keys = array_keys($keyval, $remove_string);

  // Remove any keys that were found.
  foreach ($remove_keys as $key) {
    unset($keyval[$key]);
  }

  // Rebuild the array as a multidimensional array to send to the js.
  $targeting = array();
  $i = 0;
  foreach ($keyval as $target => $value) {
    $targeting[$i] = array('target' => $target, 'value' => $value);
    $i++;
  }

  return $targeting;
}
4

1 に答える 1

0

あなたのアルゴリズムはまさにあなたがすることです:

// flatten and remove empty values
$params = array();
foreach ($values as $value) {
    if (!empty($value['value'])) {
        $params[$value['target']] = $value['value'];
    }
}

// rebuild array
$values = array();
foreach ($params as $target => $value) {
    $values[] = array(
        'target' => $target,
        'value' => $value,
    );
}
于 2013-01-29T13:22:46.023 に答える