根据在数组内部显示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)));
我没有得到重新订购数组。
谢谢
答案 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'];
}
}
关于排序:只需使用您需要的顺序设置索引,并在删除重复项后使用ksort(假设我理解正确)。
答案 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);
答案 2 :(得分:0)
对于自定义订购,我建议print(pd.get_dummies(df1.set_index('B')['A']).reset_index().groupby('B').max())
:
usort