Comprobar diferencias de dos array en PHP

publicado por: Anonymous

Estoy tratando de comprobar la diferencia de dos array para insertar o borrar datos en MySQL pero el código que tengo falla muchísimo y lo mismo hay otra forma de hacerlo más adecuada, pero no la conozco.

El código del comparador y la función para borrar es éste:

$Diferencia = array_udiff(
    $Todo,
    $EnFormulario,
    function($a, $b) { //compruebo las diferencias en ambos array para saber que borrar y que agregar
        if ($a['id'] == $b['id']) {
            return 0;
        } // Si es igual
        return -1;
    }
);

if (count($Diferencia) >= 1) {
    foreach($Diferencia as $BorrarCod) {
        $BorrarCodigos = Borrar_Datos(
            "Direcciones" ,
            "id",
            "".$BorrarCod["id"].""
        );
    }
} //borro lo que ya no exista y cierro el count

Por otro lado tengo dos consultas a MySQL que generan los dos array a comparar que serían éstos:

$Todo = Consulta_Dinamica(
    "Array",
    "*",
    "Direcciones",
    "`que` = 'Codigo' AND `idcosa` = '" . $_POST["art_nuevo"] . "' "
);

$EnFormulario = [];
foreach($UpTallicolor as $DUpColorTalli) {
    $EnFormulario[] = Consulta_Dinamica(
        "Simple",
        "*",
        "Direcciones",
        "`que` = 'Codigo' AND `idcosa` = '" . $_POST["art_nuevo"] .
            "' AND `1`='" . $DUpColorTalli['tallas'] .
            "' AND `2`='" . $DUpColorTalli['color'] . "' "
    );
}

En $Todo consulto todos los datos y los almaceno en un array.
En la variable $EnFormulario lo que hago es una consulta simple y almaceno en esa misma variable el resultado (o eso creo que hago).

Los datos que me devuelven los dos array son estos:

    $Todo 
Array
    (
        [0] => Array
            (
                [id] => 1112
                [que] => Codigo
                [idcosa] => 80
                [1] => 129
                [2] => 40
                [3] => 843446300048
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 
            )

        [1] => Array
            (
                [id] => 1113
                [que] => Codigo
                [idcosa] => 80
                [1] => 36
                [2] => 40
                [3] => 843446300049
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 
            )

        [2] => Array
            (
                [id] => 1114
                [que] => Codigo
                [idcosa] => 80
                [1] => 129
                [2] => 87
                [3] => 843446300050
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 
            )

        [3] => Array
            (
                [id] => 1115
                [que] => Codigo
                [idcosa] => 80
                [1] => 36
                [2] => 87
                [3] => 843446300051
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 
            )

    )

$Enformulario
Array
    (
        [0] => Array
            (
                [0] => 1112
                [id] => 1112
                [1] => 129
                [que] => Codigo
                [2] => 40
                [idcosa] => 80
                [3] => 843446300048
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 
                [11] => 
                [12] => 
            )

        [1] => Array
            (
                [0] => 1113
                [id] => 1113
                [1] => 36
                [que] => Codigo
                [2] => 40
                [idcosa] => 80
                [3] => 843446300049
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 
                [11] => 
                [12] => 
            )

He probado a poner un array_diff simple pero no me devuelve ningún resultado a pesar que entre $Todo y $Enformulario tienen cambios evidentes…

Realmente solo necesito que me borre lo que este en $Todo que ya no este en $Enformulario

solución

En general tu idea funciona con los datos que has proporcionado, pero el problema que estás sufriendo es que estás calculado la diferencia de datos entre dos matrices, cuando lo que quieres es averiguar qué datos de una matriz han dejado de existir en otra, que son dos cosas diferentes.

Ejemplo:

  • A -> 1, 4, 5
  • B -> 2, 4, 7

Diferencia (los que hay en A que no están en B y los que hay en B que no están en A):

1, 5, 2, 7

Lo que hay en A que no están en B:

1, 5


Una forma de llevar a cabo el trabajo sería con el siguiente código:

<?php
$Todo = array(
    0 => array(
        'id' => 1112,
        'que' => 'Codigo',
        'idcosa' => 80,
        1 => 129,
        2 => 40,
        3 => 843446300048,
    ),
    1 => array(
        'id' => 1113,
        'que' => 'Codigo',
        'idcosa' => 80,
        1 => 36,
        2 => 40,
        3 => 843446300049,
    ),
    2 => array(
        'id' => 1114,
        'que' => 'Codigo',
        'idcosa' => 80,
        1 => 129,
        2 => 87,
        3 => 843446300050,
    ),
    3 => array(
        'id' => 1115,
        'que' => 'Codigo',
        'idcosa' => 80,
        1 => 36,
        2 => 87,
        3 => 843446300051,
    )
);

$EnFormulario = array(
    0 => array(
        0 => 1112,
        'id' => 1112,
        1 => 129,
        'que' => 'Codigo',
        2 => 40,
        'idcosa' => 80,
        3 => 843446300048,
    ),

    1 => array(
        0 => 1113,
        'id' => 1113,
        1 => 36,
        'que' => 'Codigo',
        2 => 40,
        'idcosa' => 80,
        3 => 843446300049,
    )
);

/* Generamos un índice de $EnFormulario */
$formulario = [];
foreach($EnFormulario as $clave => $valor) {
    if (isset($valor['id'])) {
        $formulario[$valor['id']] = true;
    }
}

foreach($Todo as $valor) {
    if (isset($valor['id'])) {
        /* Buscamos en el índice y si no existe el valor lo borramos */
        if (!isset($formulario[$valor['id']])) {
            echo "<p>Borrando {$valor['id']}</p>n";
        }
    }
}

Lo ideal es que generaras directamente el índice desde los datos obtenidos y no haciendo un bucle para pasar por ellos.

Una forma de hacerlo sería modificando la obtención de datos así:

$Todo = Consulta_Dinamica(
    "Array",
    "*",
    "Direcciones",
    "`que` = 'Codigo' AND `idcosa` = '" . $_POST["art_nuevo"] . "' "
);
/* Generamos directamente $formulario con su índice por 'id' */
$formulario = [];
foreach($UpTallicolor as $DUpColorTalli) {
    $EnFormulario = Consulta_Dinamica(
        "Simple",
        "*",
        "Direcciones",
        "`que` = 'Codigo' AND `idcosa` = '" . $_POST["art_nuevo"] .
            "' AND `1`='" . $DUpColorTalli['tallas'] .
            "' AND `2`='" . $DUpColorTalli['color'] . "' "
    );
    if (isset($EnFormulario['id'])) {
        $formulario[$EnFormulario['id']] = $EnFormulario;
    }
}
/* Ya no hace falta hacer el bucle foreach que generaba los índices a partir de la matriz $EnFormulario */
foreach($Todo as $valor) {
    if (isset($valor['id'])) {
        /* Buscamos en el índice y si no existe el valor lo borramos */
        if (!isset($formulario[$valor['id']])) {
            echo "<p>Borrando {$valor['id']}</p>n";
        }
    }
}

Espero que ahora te hagas una mejor idea de cómo generar la matriz con los resultados de la búsqueda usando como índice uno de los campos del resultado.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *