array_diff multidimensionale

salve a tutti,

sto cercando disperatamente di venirne fuori, devo assolutamente confrontare 2 array bidimensionali e salvarmi il/i valori diversi.

posto qanto ho scritto fin'ora:

questo è quello che ho scritto:

$aDiff[] = array('0' => 'classe10', '1' => 1); 
$aDiff[] = array('0' => 'classe10', '1' => 2); 
$aDiff[] = array('0' => 'classe20', '1' => 3); 

$bDiff[] = array('0' => 'classe10', '1' => 2); 


function arrayRecursiveDiff($aArray1, $aArray2) {
    $aReturn = array();
  
    foreach ($aArray1 as $mKey => $mValue) {
        if (array_key_exists($mKey, $aArray2)) {
            if (is_array($mValue)) {
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
                if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
            } else {
                if ($mValue != $aArray2[$mKey]) {
                    $aReturn[$mKey] = $mValue;
                }
            }
        } else {
            $aReturn[$mKey] = $mValue;
        }
    }
  
    return $aReturn;
} 

print_r(arrayRecursiveDiff($bDiff, $aDiff));

però il risultato non è quello che mi aspetto:

Array
(
    [0] => Array
        (
            [1] => 2
        )

)
//invece dovrebbe restituirmi:
Array
(
    [0] => Array
        (
            [0] => classe10
            [1] => 1
        )

    [1] => Array
        (
            [0] => classe20
            [1] => 3
        )

)

il controllo in pratica deve avvenire sia sulla classe che sulla sotto classe, generandomi un array hce conterrà tutti i valori non corrispondenti.

Grazie.

inviato 5 anni fa
yusizu
modificato 5 anni fa
X 0 X
$ cat test.php 
<?php
$a = array('0' => 'classe20', '1' => 3); 
$b = array('0' => 'classe10', '1' => 2); 

print_r(array_diff($a, $b));
$ php test.php 
Array
(
    [0] => classe20
    [1] => 3
)

Per cui potresti fare anche così:

$ cat test.php 
<?php
$a = array('0' => 'classe20', '1' => 3); 
$b = array('0' => 'classe10', '1' => 2); 

function mydiff($a, $b) {
    $result1 = array_diff($a, $b);
    $result2 = array_diff($b, $a);
    return array_merge($result1, $result2);
}

function mydiff2($a, $b) {
    $result[] = array_diff($a, $b);
    $result[] = array_diff($b, $a);
    return $result;
}

print_r(mydiff($a, $b));
print_r(mydiff2($a, $b));
$ php test.php 
Array
(
    [0] => classe20
    [1] => 3
    [2] => classe10
    [3] => 2
)
Array
(
    [0] => Array
        (
            [0] => classe20
            [1] => 3
        )

    [1] => Array
        (
            [0] => classe10
            [1] => 2
        )

)
risposto 5 anni fa
Mario Santagiuliana
X 0 X

intanto grazie ma cè qualcosa che non mi torna:

$aDiff = array('0' => 'classe10', '1' => 1); 
$aDiff = array('0' => 'classe10', '1' => 2); 
$aDiff= array('0' => 'classe20', '1' => 3); 

$bDiff = array('0' => 'classe10', '1' => 2); 

echo" <pre>";

function mydiff($a, $b) {
    $result1 = array_diff($a, $b);
    $result2 = array_diff($b, $a);
    return array_merge($result1, $result2);
}

function mydiff2($a, $b) {
    $result[] = array_diff($a, $b);
    $result[] = array_diff($b, $a);
    return $result;
}

print_r(mydiff($aDiff, $bDiff));
print_r(mydiff2($aDiff, $bDiff));

il rilultato è :

Array
(
    [0] => classe20
    [1] => 3
    [2] => classe10
    [3] => 2
)
Array
(
    [0] => Array
        (
            [0] => classe20
            [1] => 3
        )

    [1] => Array
        (
            [0] => classe10
            [1] => 2
        )

)

mentre mi dovrebbe resituire:

Array
(
    [0] => Array
        (
            [0] => classe20
            [1] => 3
        )

    [1] => Array
        (
            [0] => classe10
            [1] => 1         //la classe10 con valore 2 cè, la 1 manca
        )

)

Forse dovevi specificare che il controllo deve avvenire sia sulla classe che sulla sottoclasse (valore) un qualunque caso vi siano delle differenze (la classe non cè o cè ma il suo valore è diverso) deve tornarmi con un nuovo array formato da classe e valore

risposto 5 anni fa
yusizu
modificato 5 anni fa
X 0 X

Credo che il problema sia come si sta valorizzando l'array adiff.

risposto 5 anni fa
Mario Santagiuliana
X 0 X

perdonami, ma a prescindee da omo lo stia valorizzando, che è un esempio, io i 2 array che devo controllare sono esattamente come ho scritto, ovvero bidimensionali, xcui il problema resta....

li ho valorizzati in questo modo semplicemente x dare la possibilità a chi volesse aiutarmi di "lavorare" su un esempio concreto.

risposto 5 anni fa
yusizu
X 0 X

Si ma hai valorizzato i due array prima in un modo, poi in un altro:

$ cat test.php 
<?php
$aDiff[] = array('0' => 'classe10', '1' => 1); 
$aDiff[] = array('0' => 'classe10', '1' => 2); 
$aDiff[] = array('0' => 'classe20', '1' => 3); 

$bDiff[] = array('0' => 'classe10', '1' => 2); 

print_r($aDiff);
print_r($bDiff);

Riporta:

$ php test.php 
Array
(
    [0] => Array
        (
            [0] => classe10
            [1] => 1
        )

    [1] => Array
        (
            [0] => classe10
            [1] => 2
        )

    [2] => Array
        (
            [0] => classe20
            [1] => 3
        )

)
Array
(
    [0] => Array
        (
            [0] => classe10
            [1] => 2
        )

)

Che è diverso da:

$ cat test.php 
<?php
$aDiff = array('0' => 'classe10', '1' => 1); 
$aDiff = array('0' => 'classe10', '1' => 2); 
$aDiff = array('0' => 'classe20', '1' => 3); 

$bDiff = array('0' => 'classe10', '1' => 2); 

print_r($aDiff);
print_r($bDiff);

Che ritorna:

$ php test.php 
Array
(
    [0] => classe20
    [1] => 3
)
Array
(
    [0] => classe10
    [1] => 2
)

Qual'è la valorizzazione corretta?

risposto 5 anni fa
Mario Santagiuliana
modificato 5 anni fa
X 0 X

La prima é quella corretta

risposto 5 anni fa
yusizu
X 0 X

Gianni, confido in te, sembra un problema irrisolvibile, e pure ci sarà un modo per controllare questi 2 array??

Grazie.

risposto 5 anni fa
yusizu
X 0 X

Vuoi provare questa soluzione e vedere se fa al caso tuo?

http://www.php.net/manual/en/function.array-diff.php#98680

risposto 5 anni fa
Mario Santagiuliana
X 0 X

Grazie ancora, l'avevo già provata ma cmq nn va....a dire il vero del manuale non so quante funzioni ho provato fin'ora!!

Ad ogni modo sono arrivato alla conclusione che ciò che mi hai postato funziona se i due array fossero così:

$aDiff[] = array('0' => 'classe10_1', '1' => 'classe10_2','2' => 'classe20_3','3' => 'classe30_3'); 
$bDiff[]= array('0' => 'classe10_2','1' => 'classe10_1');

function mydiff($a, $b) {
    $result1 = array_diff($a, $b);
    $result2 = array_diff($b, $a);
    return array_merge($result1, $result2);
}

function mydiff2($a, $b) {
    $result[] = array_diff($a, $b);
    $result[] = array_diff($b, $a);
    return $result;
}
$quanti = sizeof($aDiff);

for ($c = 0; $c <= $quanti; $c++) {
print_r(mydiff2($bDiff[$c],$aDiff[$c]));

}

come puoi vedere ho fatto preventivamente delle modifiche sulla valorizzazione dell'array, togliendo il secondo valore.

il risultato è:

1Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
            [2] => classe20_3
            [3] => classe30_3
        )

)


Warning:  array_diff() [function.array-diff]: Argument #1 is not an array in array.php on line 115
Warning:  array_diff() [function.array-diff]: Argument #1 is not an array in array.php on line 116
Array
(
    [0] => 
    [1] => 
)

ora però così facendo ho 2 problemi

1) come faccio a trasformormare il mio array

da:

$aDiff[] = array('0' => 'classe10_1');

$aDiff[] = array('0' => 'classe10_2');

$aDiff[]= array('0' => 'classe20_3');

$aDiff[]= array('0' => 'classe30_3');

a:

$aDiff[] = array('0' => 'classe10_1', '1' => 'classe10_2','2' => 'classe20_3','3' => 'classe30_3');

 ovvero mettere i miei array in un unico elenco

2) dovrei in qualche modo evitare che mi venga restituito un warning quando un array non è valorizzato per via del ciclo for.

Grazie mille :-\

risposto 5 anni fa
yusizu
modificato 5 anni fa
X 0 X

forse ci siamo...

dovrei solo riuscire  a trasformare i miei array da:

Array
(
    [0] => Array
        (
            [0] => classe10_2
        )

    [1] => Array
        (
            [0] => classe20_3
        )

    [2] => Array
        (
            [0] => classe30_3
        )

)

a così:

Array
(
    [0] => Array
        (
                        [0] => classe10_2
         [1] => classe20_3
         [2] => classe30_3
        )

)

così dopo anche con un semplice array_diff ottengo il confronto tra i 2 array, poichè il confronto è solo unilaterale (ovvero controllare che nell'array2 ci siano o meno i valori presenti nell'array1) per cui non serve nemmeno la funzione che mi ha gentilmente postato MarioS (che svolge un controllo bilaterale)

Grazie.

risposto 5 anni fa
yusizu
modificato 5 anni fa
X 0 X

Stai facendo due passaggi per ricreare i nuovi array?

Credo si possa farne in uno direttamente.

Per rispondere alla tua ultima domanda, credo ti basti creare un semplice ciclo for:

function newarray($a) {
   foreach($a as $key => $suba) ·{
       $newa[$key] = $suba[0];
   }
}
risposto 5 anni fa
Mario Santagiuliana
X 0 X

scusa se rispondo solo ora, cmq grazie mille MarioS!!!

...diciamo che abbiamo aggirato (smontato) il problema, ma l'importante è aver raggiunto l'obiettivo ;)

Grazie ancora.

risposto 5 anni fa
yusizu
X 0 X

Bene lo stesso allora  O0

risposto 5 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda