我有一个从数据库中提取的数组,该数组按数字
([0]=>'',[1]=>''...etc)
排序,每个元素内都有各种关联值(标题、日期、区域...等)。我需要对数组重新排序,以便具有相同“区域”变量的所有元素出现在一起。因此,实际上我们仍然有一个 ([0]=>'',[1]=>''...etc)
数组,但前 5 个左右将具有相同的“区域”,然后下一个,但许多将具有相同的“区域”,依此类推。
为了方便起见,“区域”字段有 4 个可能的值(北、西、中、布莱斯山谷)。
我不想要的是一个由 4 个区域分组的多维数组,我需要它作为一个长数组,只是按照将所有“类似”区域放在一起的顺序。
这是一个解决方案...
$arr = array(
'0' => array( 'area' => 'west' ),
'2' => array( 'area' => 'north' ),
'3' => array( 'area' => 'west' ),
'4' => array( 'area' => 'central' ),
'5' => array( 'area' => 'west' ),
'6' => array( 'area' => 'north' )
);
$new = array();
// Get a list of possible areas
$areas = array();
foreach ($arr as $key => $value) {
if ( ! in_array( $value['area'] , $areas ) ) {
array_push( $areas, $value['area'] );
}
}
// For each area...
foreach ($areas as $key => $area) {
// Find a area that matches...
foreach ($arr as $key => $value) {
if ( $value['area'] == $area ) {
array_push( $new, $value );
}
}
}
此外,如果只有一定数量的区域,您可能希望删除第一个循环。只需按照您想要的顺序用可能区域的列表填充区域数组即可。
如果您无法在 SQL 中对字段进行 ORDER BY,只需使用自定义排序函数和 usort 对数组进行排序即可。无论如何,应该不会对性能造成太大影响,具体取决于数组中的条目数量。
usort($posts, function ($a, $b) { return strcmp($a['area'], $b['area']); });
如果您想要预定的排序顺序,请添加不同区域及其优先级的列表:
$sortOrder = array(
'north' => 100,
'west' => 200,
'central' => 300,
'blyth valley' => 400,
);
usort($posts, function ($a, $b) use ($sortOrder) {
if (isset($sortOrder[$a['area']], $sortOrder[$b['area']]))
{
return $b['area'] - $a['area'];
}
if (isset($sortOrder[$a['area']]))
{
return -1;
}
if (isset($sortOrder[$b['area']]))
{
return 1;
}
return 0;
});
如果您为“区域”字段的所有可能值定义了优先级,则可以删除测试,但我建议保留它,因为您将来可能会更改可能的值。
如果您不关心区域的实际顺序,而纯粹希望将类似区域的数据分组在一起,请暂时按数据对行进行分组。 这将创建一个具有 3 个深度级别的数组。 要将数据集返回到 2 个级别,请将分组数据分散到
array_merge()
调用中。 演示
$array = [
['id' => 1, 'area' => 'west'],
['id' => 2, 'area' => 'blyth valley'],
['id' => 3, 'area' => 'north'],
['id' => 4, 'area' => 'west'],
['id' => 5, 'area' => 'central'],
['id' => 6, 'area' => 'west'],
['id' => 7, 'area' => 'north'],
];
$groups = [];
foreach ($array as $row) {
$groups[$row['area']][] = $row;
}
var_export(
array_merge(
...array_values($groups)
)
);
输出:
array (
0 =>
array (
'id' => 1,
'area' => 'west',
),
1 =>
array (
'id' => 4,
'area' => 'west',
),
2 =>
array (
'id' => 6,
'area' => 'west',
),
3 =>
array (
'id' => 2,
'area' => 'blyth valley',
),
4 =>
array (
'id' => 3,
'area' => 'north',
),
5 =>
array (
'id' => 7,
'area' => 'north',
),
6 =>
array (
'id' => 5,
'area' => 'central',
),
)