Задачка на сообразительность. :) Указывают ли две переменные на один и тот же массив

fixxxer

К.О.
Партнер клуба
Задачка на сообразительность. :) Указывают ли две переменные на один и тот же массив

PHP:
function arrays_same_zval(array &$a, array &$b) {
 /// ???????
}

$a = array(1,2,3);
$b = $a;
$c = &$a;

var_dump(arrays_same_zval($a, $b));
var_dump(arrays_same_zval($a, $c));
var_dump(arrays_same_zval($b, $c));
Контрольный результат:

bool(false)
bool(true)
bool(false)

Зачем это нужно? Ну, например, отлавливать циклические ссылки при рекурсивном разборе.
 

fixxxer

К.О.
Партнер клуба
как одна? и точка с запятой тоже одна? ну ка кинь в приват, интересно =)
 

Krishna

Продался Java
var_dump(arrays_same_zval($a, $b)); == false?

А как же отложенное копирование?
 

fixxxer

К.О.
Партнер клуба
а! я совсем забыл указать, что сравнение должно быть недеструктивным. то есть портить ничего нельзя, даже с вероятностью 0.0000000001%.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
если без контроля переполнения int - да, 1 строчка, недеструктивным очевидным методом:
return $a===$b && ($a[sizeof($a)]=null) === $b;

хотя, массив а в некотором смысле все-же портится
 

tashkentchi

Новичок
А у мну все равно 1 строка с 1 тчк и зпт. Хотя в реальной задаче, я бы таких строк не писал :)

-~{}~ 25.02.09 23:56:

Вот ничо не портица (хоть о говнокод):

return ($c = $a) && (($a = true) && ($b === true) && ($a = $c) || ! ($a = $c));
 

fixxxer

К.О.
Партнер клуба
внимание контрольный ответ :)

PHP:
function arrays_same_zval(array &$a, array &$b) {
    settype($a, 'object');
    settype($b, 'object');
    $result = $a === $b;
    settype($a, 'array');
    settype($b, 'array');
    return $result;
}
 

Dl

Новичок
Еще вариант
PHP:
return (reset($b) && end($a) && (next($a) === current($b)));
Только не понятно, как пустой массив проверить

-~{}~ 25.02.09 23:05:

Понятно))
 

fixxxer

К.О.
Партнер клуба
PHP:
return settype($a, 'object') && settype($b, 'object') && $a === $b & (settype($a, 'array') && settype($b, 'array'));
вот тебе одна, бгагага =)
 
Сверху