Agregue un incremento si existe la misma clave de matriz numérica

Tengo una siguiente matriz y necesito ordenar esta matriz en función del valor de la clave. Escribí un código y obtuve el resultado perfecto si todas las teclas numéricas son diferentes.

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

Aquí está mi código

 $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 () es el orden de clasificación que obtengo de back-end y el resultado es perfecto

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

El código está ordenando el arreglo perfectamente, pero el problema es que si existe la misma clave, es decir, alguien agregó $ cat-> getTabOrder () igual que 2 y 2 para dos valores, entonces está eliminando una clave. Necesito agregar un incremento para esto como

 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 ) 

    Como dije en un comentario, esto parece un problema XY . En realidad, no necesita incrementar las claves, necesita conservar todos los valores (incluso cuando las claves son duplicadas) y ordenarlas por clave.

    Asumiré que cuando dos o más elementos tienen la misma clave, el orden que provienen de la base de datos debe mantenerse en la lista final.

    Los objectives son:

    • mantener todos los valores;
    • ordenarlos por claves;
    • cuando dos o más elementos tienen la misma clave, mantenga el orden en que llegaron.

    Teniendo esto en cuenta, una posible solución es mantener en $order , para cada clave, la lista de elementos que tienen esa clave. Ordene la lista por claves, luego itere sobre la matriz utilizando dos bucles foreach nesteds o aplánela antes de usarla.

    El código:

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

    Un print_r($order) debería mostrar algo como:

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

    Ahora puede recuperar los valores de la matriz iterando sobre cada subarranque:

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

    Muestra:

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

    Si ya no le importan las claves y todo lo que necesita es la lista de $value después de ordenar, puede colocar los valores en una nueva lista en el doble anterior (en lugar de mostrarlos).

    O puede escribirlo de una manera más compacta utilizando array_reduce() y array_merge() :

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

    El resultado es:

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

    Observe que las claves originales se pierden, la nueva lista se indexa secuencialmente.