重複排除する必要があるかなり単純な多次元配列があります。また、値を持つキーをすべて削除する必要があるため、以下のコードでは、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;
}