In PHP programming, when traversing an array, it is often necessary to first calculate the length of the array as a condition for determining the end of the loop. , and array operations are very frequent in PHP, so count is also a commonly used function. Let’s study the specific implementation of the count function.
I have more detailed annotations on the PHP source code on github. If you are interested, you can take a look and give it a star. PHP5.4 source code annotations. You can view the added annotations through the commit record.
int <span>count</span> ( <span>mixed</span> <span>$array_or_countable</span> [, int <span>$mode</span> = COUNT_NORMAL ] )
The count function counts the number of all elements in an array or object.
For objects, if you install the SPL extension, you can call the count function by implementing the Countable interface. The Countable interface has one and only one method, Countable::count(), which returns the return value of the count() function.
mode
If the parameter mode is set to COUNT_RECURSIVE (or 1), count() will recursively calculate the array. Especially useful when calculating multi-dimensional arrays.
If the first parameter is not an array or an object that implements the Countable interface, the count function will return 1.
Note: The count function can detect recursion to avoid infinite loops, but will return an E_WARNING prompt when encountering infinite recursion or getting a value larger than expected.
<span>$arr1</span> = <span>array</span>(1, 2, 3, 4, 5<span>); </span><span>$val1</span> = <span>count</span>(<span>$arr1</span>); <span>//</span><span> 5</span>
<span>$arr2</span> = <span>array</span>('apple', 'banana', <span>array</span>('cat', 'camel'), 'dog'<span>); </span><span>$val2_1</span> = <span>count</span>(<span>$arr2</span>); <span>//</span><span> 4</span> <span>$val2_2</span> = <span>count</span>(<span>$arr2</span>, 1); <span>//</span><span> 6</span>
<span>$str</span> = "hello world"<span>; </span><span>$int_val</span> = 1<span>; </span><span>$val3</span> = <span>count</span>(<span>$str</span>); <span>//</span><span> 1</span> <span>$val4</span> = <span>count</span>(<span>$int_val</span>); <span>//</span><span> 1</span>
<span>class</span><span> User { </span><span>private</span> <span>$name</span><span>; </span><span>private</span> <span>$address</span><span>; } </span><span>$user</span> = <span>new</span><span> User(); </span><span>$val5</span> = <span>count</span>(<span>$user</span>); <span>//</span><span> 1</span> <span>$val6</span> = <span>count</span>((<span>array</span>) <span>$user</span>); <span>//</span><span> 2</span>
<span>class</span> User <span>extends</span><span> ArrayObject { </span><span>private</span> <span>$name</span><span>; </span><span>public</span> <span>function</span><span> __construct() { </span><span>$this</span>->name = 'hhq'<span>; } </span><span>public</span> <span>function</span><span> getName() { </span><span>return</span> <span>$this</span>-><span>name; } </span><span>public</span> <span>function</span> <span>count</span><span>() { </span><span>return</span> 2<span>; } } </span><span>$user2</span> = <span>new</span><span> User(); </span><span>$val7</span> = <span>count</span>(<span>$user2</span>); <span>//</span><span> 2</span>
<span>class</span> User <span>implements</span><span> Countable { </span><span>public</span> <span>function</span> <span>count</span><span>() { </span><span>return</span> 3<span>; } } </span><span>$user3</span> = <span>new</span><span> User(); </span><span>$val8</span> = <span>count</span>(<span>$user3</span>); <span>//</span><span> 3</span>
<p>进入switch语句检测参数类型</p> <p> 如果是NULL,直接返回0</p> <p> 如果是数组,调用php_count_recursive函数机选数组元素个数</p> <p> 如果是对象,先检查是否为数组对象(array-like object),如果是,则计算数组对象的数量</p> <p> 否则,如果对象实现了Countable接口,则调用Countable的count方法</p> <p> 最后,其他类型比如整型数组或字符串,都返回1。</p>
If it is an ordinary array, the count function will call the php_count_recursive function. The steps to implement its function are as follows:
<p>如果当前hash Bucket被递归访问的次数大于1,说明重复递归,染回E_WARNING错误</p> <p>否则计算当前数组层数的数组元素个数</p> <p>如果有递归参数选项,则继续递归访问</p>
If the parameter is an object type, the implementation will first determine whether the handler is defined. The handler is the structure of the object in the PHP kernel, which contains the count_elements field, which is actually a function. If an object behaves like an array, commonly known as array-like object, then the count_elements function will be executed. The specific implementation is that the class inherits PHP's ArrayObject and implements the count function in the class. The specific call is the count function. If the class does not implement the count function, count returns 0, otherwise the return value of the object's count function is returned.
If it is other data type
1. String
2. Numbers
3. When both if judgments in the object branch are false, that is, the ArrayObject is not inherited and the Countable interface is not implemented.
These types all return 1.
It should be noted that if you need to calculate the number of attributes of an object, you can first convert the object into an array and then call the count function. For example:
$count_value = count((array) $user);
While reading the source code of the count function, I got stuck at one step, which is the if (Z_OBJ_HT_P(array)->count_elements) step. Because I still couldn’t write the demo of entering this branch, I searched a lot of information on the Internet. To no avail, I consulted TIPI's reeze and finally got the answer I wanted. If you don’t understand, just ask, haha.
Original article with limited writing style and limited knowledge. If there is anything wrong in the article, please let me know.
If this article is helpful to you, please click to recommend it, thank you^_^
Finally, I have more detailed annotations on the PHP source code on github. If you are interested, you can take a look and give it a star. PHP5.4 source code annotations. You can view the added annotations through the commit record.
For more source code articles, please visit your personal homepage to continue viewing: hoohack