大家好!有人能帮我解决这个问题吗?我有一个由大约15000个元素随机创建的数组,结构如下:
<?php
$array = array(
array(
"id" => 134,
"vertical_id" => 1
),
array(
"id" => 52,
"vertical_id" => 3
),
array(
"id" => 334,
"vertical_id" => 2
),
array(
"id" => 123,
"vertical_id" => 2
),
array(
"id" => 153,
"vertical_id" => 1
),
array(
"id" => 176,
"vertical_id" => 3
),
...
);
_
我想对数组进行排序,这样最终的结果是这样的:
<?php
$array = array(
array(
"id" => 134,
"vertical_id" => 1
),
array(
"id" => 334,
"vertical_id" => 2
),
array(
"id" => 52,
"vertical_id" => 3
),
array(
"id" => 153,
"vertical_id" => 1
),
array(
"id" => 123,
"vertical_id" => 2
),
array(
"id" => 176,
"vertical_id" => 3
),
...
);
_
因此,如果我做一个array_slice,我"保证"每个垂直方向都有相同数量的元素。
有什么建议吗?
_
首先你的问题不清楚,你想让它们也按id排序吗?id的顺序重要吗?
为了给你一个想法,你需要根据一些逻辑(你想按升序或降序排列哪个键(编写自己的排序函数my_cmp((,并将该函数传递给usort。
例如,
function my_cmp($a, $b)
{
// I'm sorting based on id field in ascending order
return $a['id'] - $b['id'];
}
usort($array1, "my_cmp");
对于给定的数组,上面的代码将产生
Array
(
[0] => Array
(
[id] => 52
[vertical_id] => 3
)
[1] => Array
(
[id] => 123
[vertical_id] => 2
)
[2] => Array
(
[id] => 134
[vertical_id] => 1
)
[3] => Array
(
[id] => 153
[vertical_id] => 1
)
[4] => Array
(
[id] => 176
[vertical_id] => 3
)
[5] => Array
(
[id] => 334
[vertical_id] => 2
)
)
只需使用此示例,然后按任意方式对数组进行排序。干杯
首先,您可以将数组转换为具有相同vertical_id
的项目组的多维数组。
foreach ($array as $item) {
$groups[$item['vertical_id']][] = $item;
}
然后按关键字对组进行排序。由于我们使用vertical_id
作为外部数组的密钥,这将确保组的顺序正确。
ksort($groups);
然后,您可以在组上重复循环,从组中弹出项目,直到其中一个变为空,然后将其项目添加到新数组中。
while (true) {
// with each iteration of the foreach loop, you will get an item with vertical_id=1,
// vertical_id=2, and vertical_id=3 (in that order, because of the ksort.)
foreach ($groups as &$group) {
// using a reference to $group because otherwise foreach will just make a copy
if (!$group) break 2; // the 2 means it breaks out of the while loop
$sorted_array[] = array_pop($group); // add the item to the sorted array
}
}
如果每个vertical_id
没有相等数量的项目,则不会使用所有项目;它将继续进行,直到用完一个CCD_ 4的项目为止。