1

我有一个以下数组,我需要根据键值对该数组进行排序。如果所有数字键都不同,我写了一个代码并得到了完美的结果。

$myarray_need_to_sort =Array
(
    [13] => 214
    [14] => 215
    [15] => 216
    [21] => 223
)

这是我的代码

$order = array();
foreach ($myarray_need_to_sort as $value){
    $cat = Mage::getModel('catalog/category')->load($value);
    $order[$cat->getTabOrder()] = $value;
}   
ksort($order);
$sorted_order = array();
foreach ($order as $key=>$value)
{
    $sorted_order[$key] = $value;
}

print_r($sorted_order);

$cat->getTabOrder() 是我从后端得到的排序顺序,结果很完美

Array
(
    [1] => 216
    [2] => 223
    [3] => 215
    [4] => 214
)

该代码对数组进行了完美排序,但问题是如果存在相同的键,即有人添加了 $cat->getTabOrder() 相同的两个值,例如 2 和 2,那么它正在删除一个键。我需要为此添加一个增量

Array
(
    [1] => 216
    [2] => 223
    [2] => 215 -- it should be 3 and 4 should be 5 but it is removing 2 from here
    [4] => 214 -- should be 5
)
4

1 回答 1

0

正如我在评论中所说,这看起来像一个XY 问题。您实际上不需要增加键,您需要保留所有值(包括键重复时)并按键对它们进行排序。

我假设当两个或多个项目具有相同的键时,它们来自数据库的顺序必须保留在最终列表中。

目标是:

  • 保留所有值;
  • 按键排序;
  • 当两个或多个项目具有相同的密钥时,保持它们到达的顺序。

考虑到这一点,一个可能的解决方案是$order为每个键保留具有该键的项目列表。按键对列表进行排序,然后使用两个嵌套的 foreach 循环遍历数组或在使用之前将其展平。

编码:

// $order[$key] is the list of $cat items having $cat->getTabOrder() == $key
$order = array();
foreach ($myarray_need_to_sort as $value){
    $cat = Mage::getModel('catalog/category')->load($value);
    $key = $cat->getTabOrder();
    if (! array_key_exists($key, $order)) {
        // This is the first $cat having $key as tab order
        // Create a new list of $key
        $order[$key] = array();
    }
    // Add $value to the list of is $key (tab order)
    $order[$key][] = $value;
}
// Sort the outer array by keys
ksort($order);

Aprint_r($order)应该显示如下内容:

Array
(
    [1] => Array
        (
            [0] => 216
        )
    [2] => Array
        (
            [0] => 223
            [1] => 215
        )
    [4] => Array
        (
            [0] => 214
        )
)

现在,您可以通过遍历每个子数组来从数组中检索值:

foreach ($order as $key => $list) {
    foreach ($list as $value) {
        echo('$key='.$key.': $value='.$value."\n");
    }
}

它显示:

$key=1: $value=216
$key=2: $value=223
$key=2: $value=215
$key=4: $value=214

如果您不再关心键并且您只需要$value排序后的列表,那么您可以将值放入foreach上面双精度列表中的新列表中(而不是显示它们)。

array_reduce()或者您可以使用and以更紧凑的方式编写它array_merge()

$new = array_reduce($order, 'array_merge', array());
print_r($new);

输出是:

Array
(
    [0] => 216
    [1] => 223
    [2] => 215
    [3] => 214
)

请注意,原始键丢失了,新列表按顺序索引。

于 2016-03-14T11:22:21.343 回答