Maison  >  Article  >  développement back-end  >  Quelles sont les opérations des fonctions de tableau php ? Application de la fonction de tableau php (avec code)

Quelles sont les opérations des fonctions de tableau php ? Application de la fonction de tableau php (avec code)

不言
不言original
2018-08-06 13:43:272279parcourir

Ce que cet article vous apporte, c'est quelles sont les opérations des fonctions de tableau PHP ? L'application des fonctions de tableau PHP (avec code) a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère que cela vous sera utile.

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 implémenter des fonctions de développement quotidiennes. Mais je trouve que de nombreux 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 était livré avec /(ㄒoㄒ)/~~). L'utilisation des fonctions intégrées de PHP peut améliorer considérablement l'efficacité du développement et l'efficacité opérationnelle (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 de PHP intégré. fonctions dans des scénarios courants. De plus, si vous souhaitez en savoir plus sur les fonctions de tableau PHP, il est préférable de consulter le manuel PHP ! Cliquez ici pour consulter le manuel officiel des fonctions du tableau

Obtenir le nom de clé spécifié

Pour certains tableaux associatifs, parfois nous souhaitons uniquement obtenir la partie du nom de clé spécifié , comme un tableau Pour ['id' => 1, 'name' => 'zane', 'password' => '123456'], que se passe-t-il si nous voulons uniquement obtenir la partie contenant l'identifiant et le nom ? Collez le code directement ci-dessous.

<?php
$raw = [&#39;id&#39; => 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']

Évidemment, la simplicité est bien plus significative ! Mais qu'est-ce que c'est que array_intersect_key et array_flip ? Voici une brève introduction aux fonctions de ces deux fonctions. La première est la fonction array_flip. La fonction de cette fonction est "d'échanger les clés et les valeurs du tableau", c'est-à-dire que le nom de la clé devient un. valeur, et la valeur devient un nom de clé. Le paramètre $keys que nous avons passé est converti de [0 => 'id', 1 => 'name'] en ['id' => 0, 'name' => 1] via cette fonction. Le but de ceci est de servir la fonction array_intersect_key. La fonction de la fonction array_intersect_key est de "calculer l'intersection des tableaux en utilisant la comparaison des noms de clés", c'est-à-dire de renvoyer la valeur dans le premier tableau de paramètres avec la même valeur. nom de clé comme les autres tableaux de paramètres. De cette façon, la fonction d'obtention du nom de clé spécifié ~(≧▽≦)/~ est réalisée ! Bien entendu, pour comprendre en détail les fonctions de ces deux fonctions, vous devez toujours consulter le manuel officiel de PHP : array_flip array_intersect_key

Supprimer le nom de clé spécifié

Avec l’exemple précédent en guise de préfiguration, parlons-en brièvement, les principes sont similaires avec des différences mineures.

<?php
$raw = [&#39;id&#39; => 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']

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 "Calculer la différence des tableaux en utilisant la comparaison des noms de clés Set" est juste le contraire de la fonction de array_intersect_key. Manuel officiel : array_diff_key

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 indiqué. dans l'exemple suivant :

<?php
$input = [&#39;you are&#39; => 666, 'i am' => 233, 'he is' => 233, 'she is' => 666];
$result = array_unique($input);
var_dump($result);
// 结果 ['you are' => 666, 'i am' => 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() Premièrement, les valeurs sont triées 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 de technologie noire array_flip Comme nous le savons tous, les noms de clés des tableaux en PHP sont uniques, donc les valeurs en double seront ignorées une fois les noms de clés et les valeurs définis. échangé. Imaginez si nous appelons la fonction array_flip deux fois de suite, est-ce équivalent à réaliser la fonction de la fonction array_unique ? L'exemple de code est le suivant :

<?php
$input = [&#39;you are&#39; => 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]

Hmm ? ! Le résultat est différent de celui 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é qui apparaît, et array_flip conserve le dernier nom de clé qui apparaît.

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 cette valeur sera ignorée.

De plus, si on n'a pas besoin de conserver le nom de la clé, on peut directement utiliser array_values(array_flip($input)) comme ça.

0x04 Réinitialiser l'index

Quand on veut réinitialiser un tableau dont l'index n'est pas continu, comme le tableau : [0 => 233, 99 => 666], pour ce type de tableau il suffit 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 réinitialise non seulement 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; => 'world', 0 => 233, 99 => 666];
var_dump(array_slice($input, 0));
// 结果 ['hello' => 'world', 0 => 233, 1 => 66]

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

清除空值

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

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

为什么会出现这样的结果捏?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 函数便可以实现了。代码如下:

<?php
$power = [&#39;read&#39; => 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

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

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

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

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

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

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

<?php
$data = [&#39;first&#39; => 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]

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

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

<?php
$data = [&#39;first&#39; => 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'));
// 结果 []

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

数组中重复次数最多的值

敲黑板,划重点!据说这是一道面试题喔。假设有这样一个数组 [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 获得当前单元(当前单元默认为数组第一个成员)的键名,此时的键名即是原数组的值重复次数最多的值。

总结

虽然 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

相关文章推荐:

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

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn