我从数据库中撤回了一个数组,该数据库在每个元素中按数字([0]=>'',[1]=>''...etc)
排序,有各种关联值(标题,日期,区域等)。我需要重新排序数组,以便所有具有相同“area”变量的元素一起出现。所以我们仍然会有一个([0]=>'',[1]=>''...etc)
数组,但前5个左右会有相同的“区域”,然后是下一个,但是很多会有相同的“区域”等等。
为了方便起见,'area'字段有四个可能的值(北,西,中,blyth山谷)。
我不想要的是一个按4个区域分组的多维数组,我需要将它作为一个长数组,只需将所有“相似”区域放在一起。
我不确定我是否已尽可能地解释了这一点,但任何帮助都表示赞赏。如果您需要我清除任何内容,只需回复,我会适当添加。
答案 0 :(得分:1)
如果您无法在SQL中按字段排序,只需使用自定义排序函数对数组进行排序。无论如何,不应该过多地影响性能,具体取决于阵列中的条目数。
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;
});
如果您为“'”区域的所有可能值定义了优先级,则可以删除测试。虽然我建议将其保留下去,因为您可能会在将来更改可能的值。
答案 1 :(得分:1)
这是一个解决方案......
$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 );
}
}
}
如果只有一定数量的区域,您可能还想删除第一个循环。只需按照您想要的顺序填充区域数组中的可能区域列表。