What are the operations of php array functions? Application of php array function (with code)

不言
Release: 2023-04-03 16:24:02
Original
2254 people have browsed it

What this article brings to you is what are the operations of PHP array functions? The application of PHP array functions (with code) has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

PHP’s array is a very powerful data type. At the same time, PHP has a series of built-in array-related functions that can easily implement daily development functions. But I find that many friends seem to have ignored the role of built-in functions (for example, I have written some codes related to array operations and then found that PHP comes with /(ㄒoㄒ)/~~). Make good use of PHP's built-in functions. It greatly improves development efficiency and operating efficiency (built-in functions are written in C and are much more efficient than those written in PHP), so this article summarizes some implementation methods of using PHP built-in functions in common scenarios. In addition, if you want to learn more about PHP array functions, it is best to check the PHP manual! Click here to see the official array function manual

Get the specified key name

For some associative arrays, sometimes we only want to get the part of the specified key name, such as an array is['id' => 1, 'name' => 'zane', 'password' => '123456']What if you only want to get the part containing id and name? What about implementation? Paste the code directly below.

 1, 'name' => 'zane', 'password' => '123456']; // 自己用 PHP 实现 function onlyKeys($raw, $keys) { $new = []; foreach ($raw as $key => $val) { if (in_array($key, $keys)) { $new[$key] = $val; } } return $new; } // 用 PHP 内置函数实现 function newOnlyKeys($array, $keys) { return array_intersect_key($array, array_flip($keys)); } var_dump(onlyKeys($raw, ['id', 'name'])); // 结果 ['id' => 1, 'name' => 'zane'] var_dump(newOnlyKeys($raw, ['id', 'name'])); // 结果 ['id' => 1, 'name' => 'zane']
Copy after login

Obviously there is a lot of simplicity! But what the hell arearray_intersect_keyandarray_flip? Here is a brief introduction to the functions of these two functions. The first is thearray_flipfunction. The function of this function is to "swap the keys and values of the array", that is, the key name becomes the value, and the value becomes the key. name. The$keysparameter we passed passed through this function and changed from[0 => 'id', 1 => 'name']to['id' = > 0, 'name' => 1]. The purpose of this is to serve thearray_intersect_keyfunction. The function of thearray_intersect_keyfunction is to "use key name comparison to calculate the intersection of arrays", that is, to return the difference between the first parameter array and other Values with the same key name in the parameter array. In this way, the function of getting the specified key name ~(≧▽≦)/~ is realized! Of course, to understand the functions of these two functions in detail, you still need to check the PHP official manual: array_flip array_intersect_key

Remove the specified key name

With the previous example as a foreshadowing, Let’s just talk about this briefly, the principles are similar with minor differences.

 1, 'name' => 'zane', 'password' => '123456']; // 用 PHP 内置函数实现 function removeKeys($array, $keys) { return array_diff_key($array, array_flip($keys)); } // 移除 id 键 var_dump(removeKeys($raw, ['id', 'password'])); // 结果 ['name' => 'zane']
Copy after login

Compared with the previous example, this example just changes thearray_intersect_keyfunction toarray_diff_key, well... I believe you can guess the function of this function "Use key Compare and calculate the difference set of arrays", which is just the opposite of the function ofarray_intersect_key. Official manual: array_diff_key

Array deduplication

I believe everyone has this need. Of course, PHP also has a built-in array_unique function for everyone to use, as shown in the following example:

 666, 'i am' => 233, 'he is' => 233, 'she is' => 666]; $result = array_unique($input); var_dump($result); // 结果 ['you are' => 666, 'i am' => 233]
Copy after login

Hey, using this function can solve most of the problems, but sometimes you may feel that it is not fast enough for the following reasons:

array_unique()First put the value as The strings are sorted, then for each value only the first encountered key is retained, and all subsequent keys are ignored.

Because this function will sort the array first, the speed may not meet the expected requirements in some scenarios.

Now we can use our black technologyarray_flipfunction. As we all know, the key names of arrays in PHP are unique, so duplicate values will be ignored after the key names and values are swapped. Just imagine if we call thearray_flipfunction twice in a row, is it equivalent to realizing the function of thearray_uniquefunction? The sample code is as follows:

 666, 'i am' => 233, 'he is' => 233, 'she is' => 666]; $result = array_flip(array_flip($input)); var_dump($result); // 结果 ['she is' => 666, 'he is' => 233]
Copy after login

Huh? ! The result is different fromarray_unique! Why, we can get the answer from the PHP official manual:

If the same value appears multiple times, the last key name will be used as its value, and the other keys will be discarded.

In general,array_uniqueretains the first appearing key name,array_flipretains the last appearing key name.

Note: When usingarray_flipas an array to deduplicate, the value of the array must be able to be used as a key name (that is, string type or integer type), otherwise the value will be neglect.

In addition, if we do not need to retain the key name, we can directly usearray_values(array_flip($input)).

0x04 Reset index

When we want to reset an array whose index is not continuous, such as array:[0 => 233, 99 => 666], for this kind of array we only need to call the array_values function to achieve it. As an example:

 233, 99 => 666]; var_dump(array_values($input)); // 结果 [0 => 233, 1 => 66]
Copy after login

It should be noted that thearray_valuesfunction not only resets the numeric index, but also deletes and resets the string key name. So how do you reset the numeric index while retaining the string key name? The answer is the array_slice function. The code example is as follows:

 'world', 0 => 233, 99 => 666]; var_dump(array_slice($input, 0)); // 结果 ['hello' => 'world', 0 => 233, 1 => 66]
Copy after login

array_slice函数的功能是取出数组的中的一段,但它默认会重新排序并重置数组的数字索引,所以可以利用它重置数组中的数字索引。

清除空值

嘿,有时候我们想清除某个数组中的空值比如:nullfalse00.0[]空数组''空字符串'0'字符串0,这时 array_filter 函数便能帮上大忙。代码如下:

 'foo', 2 => -1]
Copy after login

为什么会出现这样的结果捏?array_filter的作用其实是「用回调函数过滤数组中的单元」,它的第二个参数其实是个回调函数,向数组的每个成员都执行这个回调函数,若回调函数的返回值为true便保留这个成员,为false则忽略。这个函数还有一个特性就是:

如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。

等值为 false 就是转换为 bool 类型后值为 false 的意思,详细看文档:转换为布尔类型。

注意:如果不填写callback函数,00.0'0'字符串0这些可能有意义的值会被删除。所以如果清除的规则有所不同还需要自行编写callback函数。

确认数组成员全部为真

有时候我们希望确认数组中的的值全部为true,比如:['read' => true, 'write' => true, 'execute' => true],这时我们需要用一个循环判定吗?NO,NO,NO……只需要用 array_product 函数便可以实现了。代码如下:

 true, 'write' => true, 'execute' => true]; var_dump((bool)array_product($power)); // 结果 true $power = ['read' => true, 'write' => true, 'execute' => false]; var_dump((bool)array_product($power)); // 结果 false
Copy after login

为什么能实现这个功能呢?array_product函数本来的功能是「计算数组中所有值的乘积」,在累乘数组中所有成员的时候会将成员的值转为数值类型。当传递的参数为一个 bool 成员所组成的数组时,众所周知true会被转为 1,false会被转为 0。然后只要数组中出现一个false累乘的结果自然会变成 0,然后我们再将结果转为bool类型不就是false了嘛!

注意:使用array_product函数将在计算过程中将数组成员转为数值类型进行计算,所以请确保你了解数组成员转为数值类型后的值,否则会产生意料之外的结果。比如:

 true, 'write' => true, 'execute' => 'true']; var_dump((bool)array_product($power)); // 结果 false
Copy after login

上例是因为'true'在计算过程中被转为 0。要想详细了解请点击这里。

获取指定键名之前 / 之后的数组

如果我们只想要关联数组中指定键名值之前的部分该怎么办呢?又用一个循环?当然不用我们可以通过 array_keys、array_search 和 array_slice 组合使用便能够实现!下面贴代码:

 1, 'second' => 2, 'third' => 3]; function beforeKey($array, $key) { $keys = array_keys($array); // $keys = [0 => 'first', 1 => 'second', 2 => 'third'] $len = array_search($key, $keys); return array_slice($array, 0, $len); } var_dump(beforeKey($data, 'first')); // 结果 [] var_dump(beforeKey($data, 'second')); // 结果 ['first' => 1] var_dump(beforeKey($data, 'third')); // 结果 ['first' => 1, 'second' => 2]
Copy after login

思路解析,要实现这样的功能大部分同学都应该能想到array_slice函数,但这个函数取出部分数组是根据偏移量(可以理解为键名在数组中的顺序,从 0 开始)而不是根据键名的,而关联数组的键名却是是字符串或者是不按顺序的数字,此时要解决的问题便是「如何取到键名对应的偏移量?」,这是array_keys函数便帮了我们大忙,它的功能是「返回数组中部分的或所有的键名」默认返回全部键名,此外返回的键名数组是以数字索引的,也就是说返回的键名数组的索引就是偏移量!例子中的原数组变为:[0 => 'first', 1 => 'second', 2 => 'third']。然后我们通过array_search便可以获得指定键名的偏移量了,因为这个函数的功能是「在数组中搜索给定的值,如果成功则返回首个相应的键名」。有了偏移量我们直接调用array_slice函数便可以实现目的了。

上面的例子懂了,那获取指定键名之后的数组也就轻而易举了,略微修改array_slice即可。直接贴代码:

 1, 'second' => 2, 'third' => 3]; function afterKey($array, $key) { $keys = array_keys($array); $offset = array_search($key, $keys); return array_slice($array, $offset + 1); } var_dump(afterKey($data, 'first')); // 结果 ['second' => 2, 'third' => 3] var_dump(afterKey($data, 'second')); // 结果 ['third' => 3] var_dump(afterKey($data, 'third')); // 结果 []
Copy after login

那如何获取指定值之前或之后的数组呢?嘿,记得array_search的作用吧,其实我们只需要这样调用beforeKey($data, array_search($value, $data))不就实现了嘛!

数组中重复次数最多的值

敲黑板,划重点!据说这是一道面试题喔。假设有这样一个数组[6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8],请问如何获取数组中重复次数最多的值?关键就在于 array_count_values 函数。实例代码如下:

 2, 11 => 4, 2 => 2, 4 => 3, 7 => 1, 8 => 1] arsort($cv); $max = key($cv); var_dump($max); // 结果 11
Copy after login

array_count_values函数的功能是「统计数组中所有的值」,就是将原数组中的值作为返回数组的键名,值出现的次数作为返回数组的值。这样我们便可以通过 arsort 函数对出现的次数进行降序排序并且保持索引关联。最后使用 key 获得当前单元(当前单元默认为数组第一个成员)的键名,此时的键名即是原数组的值重复次数最多的值。

总结

虽然 PHP 提供了很多和数组相关的函数,但使用起来还是不算太方便而且都是通过函数的调用方式而没有面向对象相关的实现,所以我最近在写一个开源的工具类项目 zane/utils,封装了一些常用的方法并且支持链式调用,其中的 Ary 类实现 「获取数组中重复次数最多的值」只需一行,如下所示:

$data = [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8]; $max = Ary::new($data)->countValues()->maxKey(); var_dump($max); // 结果 1
Copy after login

相关文章推荐:

如何用PHP读取excel文件内容、获取单元格数据

php设计模式:浅谈php单例模式(附代码)

The above is the detailed content of What are the operations of php array functions? Application of php array function (with code). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!