У меня есть многомерный массив, который мне нужно сортировать с уникальностью, поскольку у меня есть дублированные записи, поэтому мне нужно, чтобы array_unique
проходил через массив и удалял дубликаты по значению, например
Array ( [0] => Array ( [id] => 324 [time_start] => 1301612580 [level] => 0.002 [input_level] => 0.002 ) [1] => Array ( [id] => 325 [time_start] => 1301612580 [level] => 0.002 [input_level] => 0.002 ) [2] => Array ( [id] => 326 [time_start] => 1301612580 [level] => 0.002 [input_level] => 0.002 ) )
Есть дублированный time_start
, который они все одинаковые, также level
и input_level
но они не должны быть затронуты, только если есть соответствующий time_start
он должен удалить его и обработать весь массив (массив больше, чем вы думаете, но я просто разместил небольшой пример массива) . Следует удалить обманы и вернуться следующим образом:
Array ( [0] => Array ( [id] => 324 [time_start] => 1301612580 [level] => 0.002 [input_level] => 0.002 ) )
Вопросы, которые я нашел, которые не работают:
$input = array( /* your data */ ); $temp = array(); $keys = array(); foreach ( $input as $key => $data ) { unset($data['id']); if ( !in_array($data, $temp) ) { $temp[] = $data; $keys[$key] = true; } } $output = array_intersect_key($input, $keys);
не$input = array( /* your data */ ); $temp = array(); $keys = array(); foreach ( $input as $key => $data ) { unset($data['id']); if ( !in_array($data, $temp) ) { $temp[] = $data; $keys[$key] = true; } } $output = array_intersect_key($input, $keys);
или
$input = array( /* your data */ ); $temp = $input; foreach ( $temp as &$data ) { unset($data['id']); } $output = array_intersect_key($input, array_unique($temp));
не$input = array( /* your data */ ); $temp = $input; foreach ( $temp as &$data ) { unset($data['id']); } $output = array_intersect_key($input, array_unique($temp));
$temp = array(); array_filter($yourArray, function ($v) use (&$temp) { if (in_array($v['time_start'], $temp)) { return false; } else { array_push($temp, $v['time_start']); return true; } });
Использует array_filter()
который будет фильтровать массив на основе результата обратного вызова (я использовал анонимную функцию, которая может использоваться с PHP 5.3). Значения time_start
собираются во временный массив.
Я думаю, вам просто нужно пройти:
$usedVals = array(); $outArray = array(); foreach ($targetArray as $arrayItem) { if (!in_array($arrayItem['time_start'],$usedVals)) { $outArray[] = $arrayItem; $usedVals[] = $arrayItem['time_start']; } } return $outArray;
$uniq = array(); foreach($no_unique as $k=>$v) if(!isset($uniq[$v['time_start']])) $uniq[$v['time_start']] = $v; $uniq = array_values($uniq);