es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenar por valores en un arreglo en Mysql

Quiero ordenar manualmente elementos de una tabla. El contexto es que tengo diferentes elementos listados agrupados por tipo de artículo y luego ordenados por el id para que los números de los artículos se presenten como:

Tipo de artículo 1 – 4109
Tipo de artículo 1 – 1342
Tipo de artículo 1 – 3193
Tipo de artículo 2 – 6971
Tipo de artículo 2 – 0484

La cadena SQL se muestra a continuación:

$sql = “SELECT * FROM “‘.$tabla.'” WHERE modelo = “‘.$modelo.'” ORDER BY item, id ASC”;

En lugar de ordenar los números de los artículos en base al id ASC, quiero ordenarlos según una matriz definida, como:

$sortItem1 = [1342, 4109, 3193];
$sortItem2 = [0484, 6971];

Los elementos deben aparecer agrupados por artículo y los números de los artículos deben ordenarse según las matrices $sortItem1 y $sortItem2. El resultado debería ser:

Tipo de artículo 1 - 1342
Tipo de artículo 1 - 4109
Tipo de artículo 1 - 3193
Tipo de artículo 2 - 0484
Tipo de artículo 2 - 6971

No creo que sea posible utilizar el siguiente código, pero quiero que se ordene de la siguiente manera:

ORDER BY item, $sortItem1, $sortItem2

¿Cuál es la mejor solución para esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para ordenar manualmente elementos de una tabla es usar la función usort() de PHP para ordenar un array de elementos de acuerdo a una función de comparación personalizada que tenga en cuenta el orden de clasificación predefinido para cada tipo de elemento.

    Primero, podemos obtener los elementos de la base de datos utilizando la consulta SQL mostrada arriba y almacenar los resultados en un array. Luego, podemos definir el orden de clasificación para cada tipo de elemento como un array asociativo, donde las claves son los tipos de elemento y los valores son arrays que contienen el orden deseado para cada tipo de elemento.

    A continuación, podemos definir una función de comparación personalizada que tome dos elementos y los compare según su tipo y número de artículo, utilizando el orden de clasificación predefinido para cada tipo de elemento. La función debería devolver un valor negativo si el primer elemento debe ir antes del segundo elemento, un valor positivo si el segundo elemento debe ir antes del primer elemento o cero si los elementos son iguales.

    Finalmente, podemos usar la función usort() para ordenar el array de elementos utilizando la función de comparación personalizada, lo cual producirá el resultado deseado.

    Aquí hay un ejemplo de código que demuestra este enfoque:

    // Obtener elementos de la base de datos
    $sql = "SELECT * FROM '$table' WHERE model = '$model' ORDER BY item, id ASC";
    $result = mysqli_query($conn, $sql);
    $items = mysqli_fetch_all($result, MYSQLI_ASSOC);
    
    // Definir orden de clasificación para cada tipo de elemento
    $sorting = [
        'Tipo de elemento 1' => [1342, 4109, 3193],
        'Tipo de elemento 2' => [0484, 6971]
    ];
    
    // Definir función de comparación personalizada
    function compare_items($a, $b) {
        global $sorting;
        if ($a['item'] !== $b['item']) {
            return strcmp($a['item'], $b['item']);
        } else {
            $type = $a['item'];
            $order = $sorting[$type];
            $a_index = array_search($a['article_number'], $order);
            $b_index = array_search($b['article_number'], $order);
            return $a_index - $b_index;
        }
    }
    
    // Ordenar elementos usando la función de comparación personalizada
    usort($items, 'compare_items');
    
    // Mostrar elementos ordenados
    foreach ($items as $item) {
        echo $item['item'] . ' - ' . $item['article_number'] . "\n";
    }
    

    Este código debería producir el siguiente resultado:

    Tipo de elemento 1 - 1342
    Tipo de elemento 1 - 4109
    Tipo de elemento 1 - 3193
    Tipo de elemento 2 - 0484
    Tipo de elemento 2 - 6971
    

    Es importante tener en cuenta que este enfoque asume que los tipos de elementos en la base de datos ya están agrupados y solo necesitan ser ordenados dentro de cada grupo. Si los elementos no están agrupados por tipo de elemento, entonces puede ser necesario agregar código adicional para agruparlos antes de ordenarlos.

Comments are closed.