In diesem Artikel erfahren Sie, welche Operationen PHP-Array-Funktionen ausführen. Die Anwendung von PHP-Array-Funktionen (mit Code) hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen.
PHPs Array ist ein sehr leistungsfähiger Datentyp. Gleichzeitig verfügt PHP über eine Reihe integrierter Array-bezogener Funktionen, mit denen sich tägliche Entwicklungsfunktionen problemlos implementieren lassen. Aber ich finde, dass viele Freunde die Rolle integrierter Funktionen ignoriert haben (ich habe zum Beispiel einige Codes geschrieben, die sich auf Array-Operationen beziehen, und dann festgestellt, dass PHP mit /(ㄒoㄒ)/~~ geliefert wird Die Verwendung der integrierten PHP-Funktionen verbessert die Entwicklungs- und Betriebseffizienz erheblich (integrierte Funktionen sind in C geschrieben und viel effizienter als die in PHP geschriebenen), daher fasst dieser Artikel einige Implementierungsmethoden für die Verwendung der integrierten PHP-Funktion zusammen Funktionen in gängigen Szenarien. Wenn Sie außerdem mehr über PHP-Array-Funktionen erfahren möchten, schauen Sie sich am besten das PHP-Handbuch an! Klicken Sie hier, um das offizielle Array-Funktionshandbuch anzuzeigen
Den angegebenen Schlüsselnamen abrufen
Bei einigen assoziativen Arrays möchten wir manchmal nur den Teil des angegebenen Schlüsselnamens abrufen , wie ein Array Was ist für ['id' => 1, 'name' => 'zane', 'password' => '123456']
, wenn wir nur den Teil erhalten möchten, der die ID und den Namen enthält? Fügen Sie den Code direkt unten ein.
<?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']
Offensichtlich ist die Einfachheit viel besser! Aber was zum Teufel sind array_intersect_key
und array_flip
? Hier ist eine kurze Einführung in die Funktionen dieser beiden Funktionen. Die erste ist die Funktion array_flip
. Die Funktion dieser Funktion besteht darin, „die Schlüssel und Werte des Arrays auszutauschen“, dh der Schlüsselname wird zu einem Wert, und der Wert wird zu einem Schlüsselnamen. Der von uns übergebene $keys
-Parameter wird durch diese Funktion von [0 => 'id', 1 => 'name']
in ['id' => 0, 'name' => 1]
konvertiert. Der Zweck davon besteht darin, die Funktion array_intersect_key
zu bedienen. Die Funktion der Funktion array_intersect_key
besteht darin, „die Schnittmenge von Arrays mithilfe des Schlüsselnamenvergleichs zu berechnen“, d. h. den Wert im ersten Parameterarray mit demselben zurückzugeben Schlüsselname wie die anderen Parameter-Arrays. Auf diese Weise wird die Funktion zum Abrufen des angegebenen Schlüsselnamens ~(≧▽≦)/~ realisiert! Um die Funktionen dieser beiden Funktionen im Detail zu verstehen, müssen Sie natürlich noch das offizielle PHP-Handbuch lesen: array_flip array_intersect_key
Entfernen Sie den angegebenen Schlüsselnamen
Mit Das vorherige Beispiel dient als Vorgeschmack. Lassen Sie uns kurz darüber sprechen. Die Prinzipien sind ähnlich, mit geringfügigen Unterschieden.
<?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']
Im Vergleich zum vorherigen Beispiel ändert dieses Beispiel nur die Funktion array_intersect_key
in array_diff_key
. Nun ... ich glaube, Sie können die Funktion dieser Funktion erraten: „Berechnen Sie die Differenz mithilfe des Schlüsselnamenvergleichs.“ set of arrays" , genau die entgegengesetzte Funktion von array_intersect_key
. Offizielles Handbuch: array_diff_key
Array-Deduplizierung
Ich glaube, dass jeder dieses Bedürfnis hat. Natürlich verfügt PHP auch über eine integrierte array_unique-Funktion, die jeder verwenden kann, wie gezeigt im folgenden Beispiel:
<?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]
Hey, die Verwendung dieser Funktion kann die meisten Probleme lösen, aber manchmal haben Sie möglicherweise das Gefühl, dass sie aus folgenden Gründen nicht schnell genug ist:
array_unique () Geben Sie zuerst den Wert ein als Die Zeichenfolgen werden sortiert, dann wird für jeden Wert nur der erste gefundene Schlüssel beibehalten und alle nachfolgenden Schlüssel werden ignoriert.
Da diese Funktion zuerst das Array sortiert, entspricht die Geschwindigkeit in einigen Szenarien möglicherweise nicht den erwarteten Anforderungen.
Jetzt können wir unsere Black-Technology-Funktion array_flip
verwenden. Wie wir alle wissen, sind die Schlüsselnamen von Arrays in PHP eindeutig, sodass doppelte Werte ignoriert werden, nachdem die Schlüsselnamen und -werte vorhanden sind getauscht. Stellen Sie sich vor, wenn wir die Funktion array_flip
zweimal hintereinander aufrufen, ist das gleichbedeutend damit, die Funktion der Funktion array_unique
zu realisieren? Der Beispielcode lautet wie folgt:
<?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]
Hmm? ! Das Ergebnis ist anders als das von array_unique
! Warum, können wir dem offiziellen PHP-Handbuch entnehmen:
Wenn derselbe Wert mehrmals vorkommt, wird der letzte Schlüsselname als Wert verwendet und die anderen Schlüssel werden verworfen.
Im Allgemeinen behält array_unique
den ersten angezeigten Schlüsselnamen und array_flip
den letzten angezeigten Schlüsselnamen bei.
Hinweis: Bei Verwendung von array_flip
als Array-Deduplizierung muss der Wert des Arrays als Schlüsselname verwendet werden können (d. h. String-Typ oder Integer-Typ), andernfalls Dieser Wert wird ignoriert.
Wenn wir außerdem den Schlüsselnamen nicht beibehalten müssen, können wir array_values(array_flip($input))
direkt so verwenden.
0x04 Index zurücksetzen
Wenn wir ein Array zurücksetzen möchten, dessen Index nicht kontinuierlich ist, z. B. Array: [0 => 233, 99 => 666]
, für diese Art von Array Wir brauchen nur Um dies zu erreichen, rufen Sie die Funktion array_values auf. Zum Beispiel:
<?php $input = [0 => 233, 99 => 666]; var_dump(array_values($input)); // 结果 [0 => 233, 1 => 66]
Es ist zu beachten, dass die Funktion array_values
nicht nur den numerischen Index zurücksetzt, sondern auch den Zeichenfolgenschlüsselnamen löscht und zurücksetzt. Wie setzt man also den numerischen Index zurück und behält dabei den String-Schlüsselnamen bei? Die Antwort ist die Funktion array_slice, das Codebeispiel lautet wie folgt:
<?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
相关文章推荐:
Das obige ist der detaillierte Inhalt vonWas sind die Operationen von PHP-Array-Funktionen? Anwendung der PHP-Array-Funktion (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!