Prima di tutto devo menzionare che ho inserito documenti manuali e php e non ho trovato risposta. Ecco un codice che uso:Comportamento di array_diff_uassoc non chiaro
class chomik {
public $state = 'normal';
public $name = 'no name';
public function __construct($name) {
$this->name = $name;
}
public function __toString() {
return $this->name . " - " . $this->state;
}
}
function compare($a, $b) {
echo("$a : $b<br/>");
if($a != $b) {
return 0;
}
else return 1;
}
$chomik = new chomik('a');
$a = array(5, $chomik, $chomik, $chomik);
$b = array($chomik, 'b', 'c', 'd');
array_diff_uassoc($a, $b, 'compare');
Quello che ho pensato, array_diff_uassoc comparerà i valori di questi due array, e se i valori esiste, allora verrà eseguito il confronto chiave. E l'uscita di questo codice è:
1 : 0
3 : 1
2 : 1
3 : 2
1 : 0
3 : 1
2 : 1
3 : 2
3 : 3
3 : 2
2 : 3
1 : 3
0 : 3
Quindi prima di tutto perché alcune coppie (1: 0 o 3: 1) sono duplicati? Significa che la funzione ha dimenticato che ha già confrontato questi elementi? Ho pensato che avrebbe confrontato tutte le coppie uguali per valore, ma non l'ho visto in output. Mi sto perdendo qualcosa?
Quindi la domanda è: qual è il comportamento esatto di questa funzione in termini di ordine di confronto e perché vedo questi duplicati? (La mia versione di PHP, se aiuta è: Versione PHP 5.3.6-13ubuntu3.6)
Sono molto confuso, e in attesa di qualche buona spiegazione di esso ...
Probabilmente dovresti usare un confronto rigoroso!== non == nella funzione di confronto. –
Il confronto in sé non è un grosso problema per essere onesti in questo caso. Mi chiedo perché 'echo' sta stampando tali risultati durante il confronto. E 'echo' viene attivato prima del confronto, quindi non importa se sia rigoroso o meno. – Karol
Quello che volevo ottenere scrivendo questo codice è: voglio solo questi elementi che non sono nel secondo array ($ a [0]), e se sono nel secondo array, voglio questi elementi che hanno la stessa chiave (indice) ... Quindi ovviamente la funzione dovrebbe restituire solo $ a [0] – Karol