Part 1 of series Detecting cyclic arrays in PHP.
This post is about a problem that might only be relevant to a small minority of PHP programmers who maybe want to write a custom serializer, or something else that requires recursively iterating an array. But, in trying to solve it, I found some interesting PHP weirdness that I think is worth highlighting.
As an aside:
If you are just looking for a reliable solution for detecting cyclic arrays – and you want to miss out on learning about some cool (but also complicated) PHP quirks – then skip to Part 2 of this series.
First of all, let’s define our terms. For the purpose of this post, we can espouse a very pragmatic definition: An array is cyclic if iterating all of its items and subitems does not terminate. Cyclic arrays are also sometimes called circular or recursive. Let’s look at some examples:
// Contains a reference to itself
$v = [1, 2, 3];
$v[1] = &$v;
// Contains a nested array that contains a reference to $x
$x = [1, [2, 3]];
$x[1][1] = &$x;
// Contains a nested array that contains a reference to an ancestor
$y = [1, [2, [3, 4]]];
$y[1][1][1] = &$y[1];
// Contains a nested array that contains a reference to itself
$z = [1, [2, 3]];
$z[1][1] = &$z[1];
I think you get the idea. All of these arrays contain a cycle at some level.
Continue reading “Why it is impossible to detect cyclic arrays in pure PHP”