Ответ 1
Будет ли это делать?
function isRecursive($array) {
foreach($array as $v) {
if($v === $array) {
return true;
}
}
return false;
}
Как вы проверяете переменную для циклических ссылок?
Я использую функцию PHP var_export()
с аргументом возвращаемой строки, установленным в true
.
Я обнаружил, что Warning: var_export does not handle circular references
и задавался вопросом, знает ли кто-нибудь, как проверить, содержит ли переменная круглую ссылку, чтобы я мог использовать ее, прежде чем пытаться использовать var_export
на ней.
Я знаю, что var_export
выводит PHP-полезный текст, который можно использовать для воссоздания массива, и хотя я не использую его для этого, я все еще хочу использовать эту функцию, когда она доступна, потому что выходной формат соответствует моим необходимо. var_dump
не является опцией, потому что он не принимает аргумент для возврата строки. Я знаю, что я мог бы буферизовать вывод var_dump
, который грамотно обрабатывает циклические ссылки и сохраняет содержимое буфера в переменной, но я просто хочу знать, знает ли кто-нибудь о способе тестирования таких ссылок в переменной.
Если вы хотите создать быструю циркулярную ссылку, сделайте следующее:
$r = array();
$r[] = &$r;
var_export($r, true);
Будет ли это делать?
function isRecursive($array) {
foreach($array as $v) {
if($v === $array) {
return true;
}
}
return false;
}
Hacky, но возвращает true на основе кругового примера, который вы указали:
<?php
// create the circular reference
$r = array();
$r[] = &$r;
function isRecursive($array){
$dump = print_r($array, true);
if(strpos($dump, '*RECURSION*') !== false)
return true;
else
return false;
}
echo isRecursive($r); // returns 1
Интересно посмотреть, что еще люди придумали:)