Maison  >  Article  >  développement back-end  >  Comment utiliser intelligemment les fonctions de tableau PHP

Comment utiliser intelligemment les fonctions de tableau PHP

藏色散人
藏色散人avant
2020-03-09 16:14:152324parcourir

Préface 0x00

Le tableau de PHP est un type de données très puissant. En même temps, PHP dispose d'une série de fonctions intégrées liées aux tableaux qui peuvent facilement mettre en œuvre le développement quotidien. Fonction. Mais je trouve que beaucoup d'amis semblent avoir ignoré le rôle des fonctions intégrées (par exemple, j'ai écrit des codes liés aux opérations sur les tableaux et j'ai ensuite découvert que PHP l'accompagnait ~~. Faire bon usage des fonctions intégrées de PHP peut grandement améliorer l'efficacité et le fonctionnement du développement (les fonctions intégrées sont écrites en C et sont beaucoup plus efficaces que celles écrites en PHP), donc cet article résume certaines méthodes d'implémentation d'utilisation des fonctions intégrées PHP dans des scénarios courants. , si vous souhaitez en savoir plus sur les fonctions des tableaux PHP, c'est le plus efficace. Il vaut mieux consulter le manuel PHP /list/29/type/2.html

<.>0x01 Obtenez le nom de clé spécifié

Pour certains tableaux associatifs, parfois nous voulons simplement obtenir la partie du nom de clé spécifié, par exemple, le tableau est ['id' => 'name' => 'zane', 'password' => '123456'] Pour le moment, si vous souhaitez uniquement obtenir l'identifiant et le nom, comment implémenter la pièce

<?php
$raw = [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;, &#39;password&#39; => &#39;123456&#39;];
// 自己用 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, [&#39;id&#39;, &#39;name&#39;]));
// 结果 [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;]
var_dump(newOnlyKeys($raw, [&#39;id&#39;, &#39;name&#39;]));
// 结果 [&#39;id&#39; => 1, &#39;name&#39; => &#39;zane&#39;]
C'est évidemment très simple ! Mais que sont array_intersect_key et array_flip ? Voici une brève introduction aux fonctions de array_flip. La fonction de cette fonction est d'"inverser les clés et les valeurs du tableau", c'est-à-dire que le nom de la clé devient la valeur. , et la valeur devient le nom de la clé. Le paramètre $keys que nous passons passe par cette fonction et passe de [0 => 'id' , 1 => 'name'] à ['id' => 'name' => 1]

Le but de ceci est de servir la fonction array_intersect_key, la fonction de la fonction array_intersect_key, c'est-à-dire de "calculer l'intersection des tableaux en utilisant la comparaison des noms de clés". la valeur avec le même nom de clé dans le premier tableau de paramètres que les autres tableaux de paramètres. Cela réalise la fonction de prendre le nom de clé spécifié ~(≧▽≦)/~ Bien sûr, pour en savoir plus sur les fonctions de ces deux-là. fonctions, vous devez toujours consulter le manuel officiel de PHP : array_flip array_intersect_key

0x02 Supprimer le nom de clé spécifié

Avec l'exemple précédent Pour préparer le terrain, parlons-en à ce sujet brièvement. Les principes sont similaires.

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

Par rapport à l'exemple précédent, cet exemple change simplement la fonction array_intersect_key en array_diff_key. Eh bien... je pense que vous pouvez deviner la fonction de cette fonction. différence de tableaux utilisant la comparaison des noms de clés" est juste le contraire de la fonction de array_intersect_key. Manuel officiel : array_diff_key

0x03 Déduplication de tableau

Je pense que tout le monde a ce besoin. Bien sûr, PHP a également une fonction array_unique intégrée que tout le monde peut utiliser, comme. montré dans l'exemple suivant :

<?php
$input = [&#39;you are&#39; => 666, &#39;i am&#39; => 233, &#39;he is&#39; => 233, &#39;she is&#39; => 666];
$result = array_unique($input);
var_dump($result);
// 结果 [&#39;you are&#39; => 666, &#39;i am&#39; => 233]

Hé, la plupart des problèmes peuvent être résolus avec cette fonction, mais parfois vous pouvez avoir l'impression qu'elle n'est pas assez rapide pour les raisons suivantes :

array_unique( ) trie d'abord les valeurs sous forme de chaînes, puis pour chaque valeur, seule la première clé rencontrée est conservée et toutes les clés suivantes sont ignorées.

Étant donné que cette fonction triera le tableau en premier, la vitesse peut ne pas répondre aux exigences attendues dans certains scénarios.

Nous pouvons maintenant utiliser notre fonction array_flip de technologie noire. Comme nous le savons tous, les noms de clé des tableaux en PHP sont uniques, donc les valeurs en double seront ignorées après l'échange des noms de clé et des valeurs. Imaginez si nous appelons la fonction array_flip deux fois de suite, est-ce équivalent à réaliser la fonction array_unique ? L'exemple de code est le suivant :

<?php
$input = [&#39;you are&#39; => 666, &#39;i am&#39; => 233, &#39;he is&#39; => 233, &#39;she is&#39; => 666];
$result = array_flip(array_flip($input));
var_dump($result);
// 结果 [&#39;she is&#39; => 666, &#39;he is&#39; => 233]

Hmm ? ! Le résultat est différent de array_unique ! Pourquoi, nous pouvons obtenir la réponse dans le manuel officiel de PHP :

Si la même valeur apparaît plusieurs fois, le dernier nom de clé sera utilisé comme valeur et les autres clés seront ignorées.

En général, array_unique conserve le premier nom de clé apparaissant et array_flip conserve le dernier nom de clé apparaissant.

Remarque : lors de l'utilisation de array_flip comme déduplication de tableau, la valeur du tableau doit pouvoir être utilisée comme nom de clé (c'est-à-dire type de chaîne ou type entier), sinon la valeur sera ignorée.

De plus, si nous n'avons pas besoin de conserver le nom de la clé, nous pouvons directement utiliser array_values(array_flip($input)) comme ceci.

0x04 Réinitialiser l'index

Lorsque nous voulons réinitialiser un tableau avec des index non continus, tel qu'un tableau : [0 => 233, 99 => 666] , pour ce type de tableau, il suffit d'appeler la fonction array_values ​​​​pour y parvenir. Par exemple :

<?php
$input = [0 => 233, 99 => 666];
var_dump(array_values($input));
// 结果 [0 => 233, 1 => 66]

Il convient de noter que la fonction array_values ​​​​​​non seulement réinitialise l'index numérique, mais supprime et réinitialise également le nom de la clé de chaîne. Alors, comment réinitialiser l’index numérique tout en conservant le nom de la clé de chaîne ? La réponse est la fonction array_slice. L'exemple de code est le suivant :

<?php
$input = [&#39;hello&#39; => &#39;world&#39;, 0 => 233, 99 => 666];
var_dump(array_slice($input, 0));
// 结果 [&#39;hello&#39; => &#39;world&#39;, 0 => 233, 1 => 66]

la fonction array_slice consiste à supprimer un segment du tableau, mais elle réorganisera et réinitialisera l'index numérique du tableau par défaut, donc vous peut l'utiliser pour réinitialiser la fonction array_slice.

0x05 Effacer la valeur nulle

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

<?php
$input = [&#39;foo&#39;, false, -1, null, &#39;&#39;, []];
var_dump(array_filter($input));
// 结果 [0 => &#39;foo&#39;, 2 => -1]

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

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

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

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

0x06 确认数组成员全部为真

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

<?php
$power = [&#39;read&#39; => true, &#39;write&#39; => true, &#39;execute&#39; => true];
var_dump((bool)array_product($power));
// 结果 true
$power = [&#39;read&#39; => true, &#39;write&#39; => true, &#39;execute&#39; => false];
var_dump((bool)array_product($power));
// 结果 false

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

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

<?php
$power = [&#39;read&#39; => true, &#39;write&#39; => true, &#39;execute&#39; => &#39;true&#39;];
var_dump((bool)array_product($power));
// 结果 false

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

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

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

<?php
$data = [&#39;first&#39; => 1, &#39;second&#39; => 2, &#39;third&#39; => 3];
function beforeKey($array, $key) {
    $keys = array_keys($array);
      // $keys = [0 => &#39;first&#39;, 1 => &#39;second&#39;, 2 => &#39;third&#39;]
    $len = array_search($key, $keys);
    return array_slice($array, 0, $len);
}
var_dump(beforeKey($data, &#39;first&#39;));
// 结果 []
var_dump(beforeKey($data, &#39;second&#39;));
// 结果 [&#39;first&#39; => 1]
var_dump(beforeKey($data, &#39;third&#39;));
// 结果 [&#39;first&#39; => 1, &#39;second&#39; => 2]

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

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

<?php
$data = [&#39;first&#39; => 1, &#39;second&#39; => 2, &#39;third&#39; => 3];
function afterKey($array, $key) {
    $keys = array_keys($array);
    $offset = array_search($key, $keys);
    return array_slice($array, $offset + 1);
}
var_dump(afterKey($data, &#39;first&#39;));
// 结果 [&#39;second&#39; => 2, &#39;third&#39; => 3]
var_dump(afterKey($data, &#39;second&#39;));
// 结果 [&#39;third&#39; => 3]
var_dump(afterKey($data, &#39;third&#39;));
// 结果 []

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

0x08 数组中重复次数最多的值

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

<?php
$data = [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8];
$cv = array_count_values($data);
// $cv = [6 => 2, 11 => 4, 2 => 2, 4 => 3, 7 => 1, 8 => 1]
arsort($cv);
$max = key($cv);
var_dump($max);
// 结果 11

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

0x09 打广告时间

虽然 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);
// 结果 11

欢迎大家给我提 issue 和 pr,另外如果你喜欢这个项目希望动动小手点个 star。

项目地址:https://github.com/zanemmm/utils

0x0A 结语

其实还有很多实用的函数没有介绍,但是限于文章篇幅就讲到这里了吧。本文出现的很多例子都并非本人原创的,多数出于 PHP 官方手册(每个函数功能下面的评论里都有很多大神提出一些厉害的用法,部分示例就是出自评论)。在下只是拾人牙慧,将其总结了一下。另外文章中若出现错误,希望大家能够指出,若有疑问可以互相讨论。

更多编程相关内容,请关注php中文网编程入门栏目!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer