根据子数组重复值删除数组项,然后重新排序数组

时间:2016-12-03 22:03:42

标签: php arrays duplicates

根据在数组内部显示1级更深的重复值删除数组项。一旦项目被重复排序,那么重新订购新阵列将会很酷。

这是当前的输入数组...

ARRAY
(
  [0] => ARRAY
    (
      [TYPE] => PHOTOS
    )

  [1] => ARRAY
    (
      [TYPE] => DOCUMENTS
    )

  [2] => ARRAY
    (
      [TYPE] => DOCUMENTS 
    )

  [3] => ARRAY
    (
      [TYPE] => VIDEOS
    )

  [4] => ARRAY
    (
      [TYPE] => PHOTOS
    )

)

如果我从这个数组输出TYPE,我得到这个......

[TYPE] => PHOTOS
[TYPE] => DOCUMENTS
[TYPE] => DOCUMENTS
[TYPE] => VIDEOS
[TYPE] => PHOTOS

我想从此输入中删除所有重复项,因此我留下了这个新输出...

[TYPE] => PHOTOS
[TYPE] => DOCUMENTS
[TYPE] => VIDEOS

但是可以设置和排序每个TYPE值。例如,我可以使用变量或其他东西设置预定订单。有关将新阵列重新排序为特定订单的任何建议。使用这个新订单...

$photos = 1;
$videos = 2;
$documents = 3;

或使用数组的新订单可能......

$new_order = array(
  1 => 'PHOTOS',
  2 => 'VIDEOS',
  3 => 'DOCUMENTS'
)

任何帮助都会很好。我已经尝试了array_unique和array_map但我似乎无法找出如何指定检查重复项的子数组键。

这是我到目前为止所尝试过的......

$downloads = get_field('downloads');
$types = array_unique($downloads));

$downloads = get_field('downloads');
$types = array_map("unserialize", array_unique(array_map("serialize", $downloads)));

我没有得到重新订购数组。

谢谢

3 个答案:

答案 0 :(得分:1)

用于删除“子阵列”副本的快速而肮脏的解决方案:

$a = [];
$a[]['type'] = 'photos';
$a[]['type'] = 'documents';
$a[]['type'] = 'documents';
$a[]['type'] = 'videos';
$a[]['type'] = 'photos';


$b = [];
foreach( $a as $index => $subA ) {
   if( in_array($subA['type'], $b) ) {
        unset($a[$index]);
   } else {
       $b[] = $subA['type'];
   }
}

关于排序:只需使用您需要的顺序设置索引,并在删除重复项后使用kso​​rt(假设我理解正确)。

答案 1 :(得分:1)

只需使用array_intersect计算两个数组的公共部分。如果使用order数组作为第一个参数,则将保留该顺序。

您的意见:

$input = [
    ['TYPE' => 'PHOTOS'],
    ['TYPE' => 'DOCUMENTS'],
    ['TYPE' => 'DOCUMENTS'],
    ['TYPE' => 'VIDEOS'],
    ['TYPE' => 'PHOTOS']
];

我已经编写了简单的功能来满足您的所有需求:

function do_awesomness($input, $key = 'TYPE', $order = ['PHOTOS', 'VIDEOS', 'DOCUMENTS'])
{
    $result = [];
    foreach($input as $k => $value)
        $result[] = $value[$key];
    $result = array_unique($result);

    return array_values(array_intersect($order, $result));
}

用法:

do_awesomness($input);

工作示例:http://phpio.net/s/1lo1

答案 2 :(得分:0)

对于自定义订购,我建议print(pd.get_dummies(df1.set_index('B')['A']).reset_index().groupb‌​y('B').max())

usort