


[PHP source code reading] count function, php source code count function_PHP tutorial
Jul 12, 2016 am 08:51 AM[PHP source code reading] count function, php source code count function
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.
count
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.
Parameter description
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.
Run the example
Normal Application
<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>
Multidimensional array
<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>
Numbers and Strings
<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>
Common objects
<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>
array-like object
<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>
Implement Countable interface object
<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>
Run steps
<p>進(jìn)入switch語(yǔ)句檢測(cè)參數(shù)類型</p> <p> 如果是NULL,直接返回0</p> <p> 如果是數(shù)組,調(diào)用php_count_recursive函數(shù)機(jī)選數(shù)組元素個(gè)數(shù)</p> <p> 如果是對(duì)象,先檢查是否為數(shù)組對(duì)象(array-like object),如果是,則計(jì)算數(shù)組對(duì)象的數(shù)量</p> <p> 否則,如果對(duì)象實(shí)現(xiàn)了Countable接口,則調(diào)用Countable的count方法</p> <p> 最后,其他類型比如整型數(shù)組或字符串,都返回1。</p>
Source code interpretation
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>如果當(dāng)前hash Bucket被遞歸訪問的次數(shù)大于1,說明重復(fù)遞歸,染回E_WARNING錯(cuò)誤</p> <p>否則計(jì)算當(dāng)前數(shù)組層數(shù)的數(shù)組元素個(gè)數(shù)</p> <p>如果有遞歸參數(shù)選項(xiàng),則繼續(xù)遞歸訪問</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);
Summary
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

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

TosecurelyhandleauthenticationandauthorizationinPHP,followthesesteps:1.Alwayshashpasswordswithpassword_hash()andverifyusingpassword_verify(),usepreparedstatementstopreventSQLinjection,andstoreuserdatain$_SESSIONafterlogin.2.Implementrole-basedaccessc

To safely handle file uploads in PHP, the core is to verify file types, rename files, and restrict permissions. 1. Use finfo_file() to check the real MIME type, and only specific types such as image/jpeg are allowed; 2. Use uniqid() to generate random file names and store them in non-Web root directory; 3. Limit file size through php.ini and HTML forms, and set directory permissions to 0755; 4. Use ClamAV to scan malware to enhance security. These steps effectively prevent security vulnerabilities and ensure that the file upload process is safe and reliable.

In PHP, the main difference between == and == is the strictness of type checking. ==Type conversion will be performed before comparison, for example, 5=="5" returns true, and ===Request that the value and type are the same before true will be returned, for example, 5==="5" returns false. In usage scenarios, === is more secure and should be used first, and == is only used when type conversion is required.

The methods of using basic mathematical operations in PHP are as follows: 1. Addition signs support integers and floating-point numbers, and can also be used for variables. String numbers will be automatically converted but not recommended to dependencies; 2. Subtraction signs use - signs, variables are the same, and type conversion is also applicable; 3. Multiplication signs use * signs, which are suitable for numbers and similar strings; 4. Division uses / signs, which need to avoid dividing by zero, and note that the result may be floating-point numbers; 5. Taking the modulus signs can be used to judge odd and even numbers, and when processing negative numbers, the remainder signs are consistent with the dividend. The key to using these operators correctly is to ensure that the data types are clear and the boundary situation is handled well.

Yes, PHP can interact with NoSQL databases like MongoDB and Redis through specific extensions or libraries. First, use the MongoDBPHP driver (installed through PECL or Composer) to create client instances and operate databases and collections, supporting insertion, query, aggregation and other operations; second, use the Predis library or phpredis extension to connect to Redis, perform key-value settings and acquisitions, and recommend phpredis for high-performance scenarios, while Predis is convenient for rapid deployment; both are suitable for production environments and are well-documented.

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

TosettherighttimezoneinPHP,usedate_default_timezone_set()functionatthestartofyourscriptwithavalididentifiersuchas'America/New_York'.1.Usedate_default_timezone_set()beforeanydate/timefunctions.2.Alternatively,configurethephp.inifilebysettingdate.timez
