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 = &$v; // Contains a nested array that contains a reference to $x $x = [1, [2, 3]]; $x = &$x; // Contains a nested array that contains a reference to an ancestor $y = [1, [2, [3, 4]]]; $y = &$y; // Contains a nested array that contains a reference to itself $z = [1, [2, 3]]; $z = &$z;
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”