删除基于重复值的数组项,这些重复值在数组中出现在更深的一层。一旦这些重复项被排序,那么重新排序新的数组将是很酷的。
这是当前输入数组...
$downloads = [
['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)));
我还没来得及给数组排序呢。
6条答案
按热度按时间vktxenjb1#
使用
array_column
、array_map
、array_search
和usort
函数的解决方案:输出:
cgyqldqp2#
用于删除“子阵列”重复项的快速而又不繁琐的解决方案:
关于排序:只需要按照需要的顺序设置索引,然后在删除重复项后使用ksort(假设我没有理解错)。
tquggr8v3#
简单地使用
array_intersect
来计算两个数组的公共部分。如果你使用order array作为第一个参数,那么它的顺序将被保留。您的输入:
我已经写了简单的函数来实现你的所有需求:
用法:
工作示例:http://phpio.net/s/1lo1
ux6nzvsh4#
你可以使用
array_reduce
来重新实现array_unique
,但是按照出现的顺序收集唯一类型。这将有助于我们稍后对数组进行排序。遍历数组,检查类型键是否存在于
$types
中,如果存在,跳过此元素,否则,设置此键并从$order
中赋值给它(这将用于排序)。然后我们使用
array_multisort
通过排序$types
来排序$uniqueDownloads
。这是working demo。
阅读更多关于anonymous functions的信息。我已经通过引用
&
传递了$types
,所以函数改变了原始数组的值,但没有改变副本的值。xzv2uavs5#
对于自定义订购,我推荐
usort
:w8biq8rn6#
因为排序数组似乎是可能下载值的详尽列表,所以可以只按下载值过滤该静态数组。
代码:(Demo)
如果下载数组中可能存在排序数组中未表示的值,则应调整问题中的样本数据,以更好地表示应用程序数据。