この記事でわかるのは、PHP 配列関数の操作とは何なのかということです。 PHPの配列関数の応用(コード付き)は参考になりますので、困っている方は参考にしていただければ幸いです。
PHP の配列は非常に強力なデータ型であると同時に、日々の開発機能を簡単に実装できる一連の配列関連関数が組み込まれています。しかし、多くの友人は組み込み関数の役割を無視しているようです (たとえば、配列演算に関連するコードをいくつか書いた後、PHP には /(ㄒoㄒ)/~~ が付属していることに気づきました)。 PHPの組み込み関数を利用することで、開発効率や運用効率が大幅に向上します(組み込み関数はC言語で記述されており、PHPで記述した関数よりもはるかに効率的です)ので、本記事ではPHPの組み込み関数を利用した実装方法をいくつかまとめます。一般的なシナリオでの機能。また、PHP の配列関数について詳しく知りたい場合は、PHP のマニュアルを確認するのが最適です。公式の配列関数マニュアルを参照するには、ここをクリックしてください。
指定されたキー名の取得
一部の連想配列では、指定されたキー名の一部のみを取得したい場合があります。 、配列などは #['id' => 1, 'name' => 'zane', 'password' => '123456']
部分だけを取得したい場合はどうすればよいですかID と名前が含まれていますか?実装はどうですか?コードをすぐ下に貼り付けます。
<?php $raw = ['id' => 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']
明らかに、非常にシンプルです。しかし、array_intersect_key
と array_flip
とは一体何なのでしょうか?これら 2 つの関数の機能を簡単に紹介します。1 つ目は array_flip
関数です。この関数の機能は「配列のキーと値を交換する」ことです。 、キー名が値になり、値がキー名になります。この関数を介して渡した $keys
パラメータは、[0 => 'id', 1 => 'name']
から ['id' に変更されました。 = > 0、「名前」 => 1]
。この目的は、array_intersect_key
関数を提供することです。array_intersect_key
関数の機能は、「キー名の比較を使用して配列の共通部分を計算する」こと、つまり、最初のパラメータ配列と、パラメータ配列内の同じキー名を持つ他の値との違い。このようにして、指定したキー名を取得する機能〜(≧▽≦)/〜が実現しました!もちろん、これら 2 つの関数の機能を詳しく理解するには、PHP 公式マニュアルを確認する必要があります。 array_flip array_intersect_key
指定されたキー名を削除します
With前の例は伏線として説明しました。これについては簡単に説明します。原理は似ていますが、わずかな違いがあります。
<?php $raw = ['id' => 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']
前の例と比較すると、この例では array_intersect_key
関数を array_diff_key
に変更しているだけです。まあ...この関数の機能は推測できると思います。キー比較を使用して、配列の差分セットを計算します。これは、array_intersect_key
の関数の逆です。公式マニュアル: array_diff_key
配列の重複排除
誰もがこのニーズを持っていると思います。もちろん、PHP には、次に示すように、誰でも使用できる組み込みの array_unique 関数もあります。次の例では:
<?php $input = ['you are' => 666, 'i am' => 233, 'he is' => 233, 'she is' => 666]; $result = array_unique($input); var_dump($result); // 结果 ['you are' => 666, 'i am' => 233]
この関数を使用するとほとんどの問題は解決できますが、次の理由により速度が十分ではないと感じる場合があります:
array_unique () 最初に値を次のように入力します。文字列がソートされ、各値に対して最初に見つかったキーのみが保持され、後続のキーはすべて無視されます。
この関数は最初に配列を並べ替えるため、一部のシナリオでは速度が予想される要件を満たさない可能性があります。
これで、ブラック テクノロジーの array_flip
関数を使用できるようになります。ご存知のとおり、PHP の配列のキー名は一意であるため、キー名の後に重複する値は無視され、値が交換されます。想像してみてください。array_flip
関数を 2 回続けて呼び出した場合、それは array_unique
関数の機能を実現するのと同じでしょうか?サンプルコードは次のとおりです。
<?php $input = ['you are' => 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]
え? !結果は array_unique
とは異なります!その答えは、PHP 公式マニュアルから得ることができます。
同じ値が複数回出現する場合、最後のキー名がその値として使用され、他のキーは破棄されます。
一般に、array_unique
は最初に出現するキー名を保持し、array_flip
は最後に出現するキー名を保持します。
注: array_flip
を重複排除する配列として使用する場合、配列の値はキー名 (つまり、文字列型) として使用できる必要があります。または整数型)、それ以外の場合、値は無視されます。
さらに、キー名を保持する必要がない場合は、array_values(array_flip($input))
を直接使用できます。
0x04 インデックスのリセット
配列など、インデックスが連続していない配列をリセットしたい場合: [0 => 233, 99 = > 666]
、この種の配列の場合、array_values 関数を呼び出すだけでそれを実現できます。例:
<?php $input = [0 => 233, 99 => 666]; var_dump(array_values($input)); // 结果 [0 => 233, 1 => 66]
array_values
関数は数値インデックスをリセットするだけでなく、文字列キー名も削除してリセットすることに注意してください。では、文字列キー名を保持したまま数値インデックスをリセットするにはどうすればよいでしょうか?答えは array_slice 関数です。コード例は次のとおりです:
<?php $input = ['hello' => 'world', 0 => 233, 99 => 666]; var_dump(array_slice($input, 0)); // 结果 ['hello' => 'world', 0 => 233, 1 => 66]
array_slice
函数的功能是取出数组的中的一段,但它默认会重新排序并重置数组的数字索引,所以可以利用它重置数组中的数字索引。
清除空值
嘿,有时候我们想清除某个数组中的空值比如:null
、false
、0
、0.0
、[]空数组
、''空字符串
、'0'字符串0
,这时 array_filter 函数便能帮上大忙。代码如下:
<?php $input = ['foo', false, -1, null, '', []]; var_dump(array_filter($input)); // 结果 [0 => 'foo', 2 => -1]
为什么会出现这样的结果捏?array_filter
的作用其实是「用回调函数过滤数组中的单元」,它的第二个参数其实是个回调函数,向数组的每个成员都执行这个回调函数,若回调函数的返回值为 true
便保留这个成员,为 false
则忽略。这个函数还有一个特性就是:
如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。
等值为 false 就是转换为 bool 类型后值为 false 的意思,详细看文档:转换为布尔类型。
注意:如果不填写 callback
函数,0
、0.0
、'0'字符串0
这些可能有意义的值会被删除。所以如果清除的规则有所不同还需要自行编写 callback
函数。
确认数组成员全部为真
有时候我们希望确认数组中的的值全部为 true
,比如:['read' => true, 'write' => true, 'execute' => true]
,这时我们需要用一个循环判定吗?NO,NO,NO……只需要用 array_product 函数便可以实现了。代码如下:
<?php $power = ['read' => 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 = ['read' => true, 'write' => true, 'execute' => 'true']; var_dump((bool)array_product($power)); // 结果 false
上例是因为 'true'
在计算过程中被转为 0。要想详细了解请点击这里。
获取指定键名之前 / 之后的数组
如果我们只想要关联数组中指定键名值之前的部分该怎么办呢?又用一个循环?当然不用我们可以通过 array_keys、array_search 和 array_slice 组合使用便能够实现!下面贴代码:
<?php $data = ['first' => 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 = ['first' => 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の配列関数の操作は何ですか? PHPの配列関数の応用(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。