0

我从数据库中提取了一个数组,该数组按([0]=>'',[1]=>''...etc)每个元素中的数字排序,有各种关联值(标题、日期、区域...等)。我需要对数组进行重新排序,以便所有具有相同“面积”变量的元素一起出现。所以有效地我们仍然有一个([0]=>'',[1]=>''...etc)数组,但前 5 个左右将具有相同的“面积”,然后下一个但许多将具有相同的“面积”,依此类推。

为方便起见,“区域”字段有 4 个可能的值(北、西、中、布莱斯谷)。

我不想要的是一个由 4 个区域分组的多维数组,我需要它作为一个长数组,只是按照将所有“喜欢”区域放在一起的顺序。

不确定我是否已经尽可能地解释了这一点,但任何帮助表示赞赏。如果您需要我清除任何内容,请回复,我会适当添加。

4

2 回答 2

1

如果您无法在 SQL 中按字段排序,只需使用带有 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;
});

如果您为“区域”字段的所有可能值定义了优先级,则可以删除测试,尽管我建议您保留它,因为您将来可能会更改可能的值。

于 2012-07-16T12:40:06.920 回答
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 );
        }
    }
}

如果只有一定数量的区域,您可能还需要删除第一个循环。只需按照您想要的顺序用可能的区域列表填充区域数组。

于 2012-07-16T12:41:17.217 回答