Прежде всего, я должен упомянуть, что я выкопал документы вручную и php и не нашел ответа. Вот код, я использую:Поведение array_diff_uassoc непонятно
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');
То, что я думал, array_diff_uassoc будет сравнить все значения этих двух массивов, и если значения существует, то будет работать ключ сравнения. И выход из этого кода:
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
Итак, прежде всего, почему некоторые пары (1: 0 или 3: 1) дублируются? Означает ли это, что функция забыла, что она уже сравнила эти предметы? Я думал, что он будет сравнивать все пары с равным значением, но я не вижу его в выходе. Я что-то упускаю?
Вопрос: что такое точное поведение этой функции в терминах порядка сравнения, и почему я вижу это дубликаты? (Мой PHP версия, если это поможет это: PHP Version 5.3.6-13ubuntu3.6)
Я действительно путают, и ожидая какого-то хорошее объяснение этого ...
Вы должны, вероятно, использовать строгое сравнение!== not == в функции сравнения. –
Сравнение в этом случае не является большой честью. Мне интересно, почему «эхо» печатает такие результаты при сравнении. И 'echo' запускается перед сравнением, поэтому не имеет значения, насколько он строг или нет. – Karol
Я хотел бы написать этот код: я хочу только эти элементы, которые не находятся во втором массиве ($ a [0]), и если они находятся во втором массиве, я хочу, чтобы эти элементы имели один и тот же ключ (индекс) ... Так что, конечно, функция должна возвращать только $ a [0] – Karol