如果存在相同的数字数组键,则增加一个增量

Add one increment if same numeric array key exists

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

$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
)

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

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

目标是:

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

考虑到这一点,一个可能的解决方案是在 $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);

A print_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
)

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