in_array() 和多维数组
我使用 in_array()
来检查数组中是否存在某个值,如下所示,
$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $a))
{
echo "Got Irix";
}
//print_r($a);
但是多维数组(如下)怎么样 - 如何检查该值是否存在于多数组中?
$b = array(array("Mac", "NT"), array("Irix", "Linux"));
print_r($b);
或者当涉及多维数组时我不应该使用 in_array()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(24)
in_array()
不适用于多维数组。您可以编写一个递归函数来为您执行此操作:用法:
in_array()
does not work on multidimensional arrays. You could write a recursive function to do that for you:Usage:
如果您知道要搜索哪一列,则可以使用 array_search() 和 array_column():
这个想法位于 PHP 手册中 array_search() 的注释部分;
If you know which column to search against, you can use array_search() and array_column():
This idea is in the comments section for array_search() on the PHP manual;
这也会起作用。
用法:
This will work too.
Usage:
这样就可以做到:
in_array
仅对一维数组进行操作,因此您需要循环遍历每个子数组并在每个子数组上运行in_array
。正如其他人所指出的,这仅适用于二维数组。如果您有更多嵌套数组,则递归版本会更好。有关示例,请参阅其他答案。
This will do it:
in_array
only operates on a one dimensional array, so you need to loop over each sub array and runin_array
on each.As others have noted, this will only for for a 2-dimensional array. If you have more nested arrays, a recursive version would be better. See the other answers for examples of that.
如果你的数组像这样
使用这个
例子:
echo in_multiarray("22", $array,"Age");
if your array like this
Use this
example :
echo in_multiarray("22", $array,"Age");
对于多维子代:
in_array('needle', array_column($arr, 'key'))
对于一维子代:
in_array ('needle', call_user_func_array('array_merge', $arr))
For Multidimensional Children:
in_array('needle', array_column($arr, 'key'))
For One Dimensional Children:
in_array('needle', call_user_func_array('array_merge', $arr))
很棒的功能,但它对我不起作用,直到我添加了
if($found) { break; }
到elseif
Great function, but it didnt work for me until i added the
if($found) { break; }
to theelseif
从PHP 5.6开始,对于原始答案有一个更好、更干净的解决方案:
对于像这样的多维数组:
我们可以使用splat 运算符 :
如果您有字符串键像这样:
您必须使用
array_values
以避免错误Cannot unpack array with string keywords
:Since PHP 5.6 there is a better and cleaner solution for the original answer :
With a multidimensional array like this :
We can use the splat operator :
If you have string keys like this :
You will have to use
array_values
in order to avoid the errorCannot unpack array with string keys
:您始终可以序列化多维数组并执行
strpos
:我使用的内容的各种文档:
You could always serialize your multi-dimensional array and do a
strpos
:Various docs for things I used:
我相信你现在可以使用 array_key_exists :
I believe you can just use array_key_exists nowadays:
接受的解决方案(在撰写本文时)由jwueller
完全正确,但在进行弱比较时可能会出现意外行为(参数
$strict = false
)。由于 PHP 在比较不同类型的值时的类型杂乱
,并且
评估
true
因为"example"
被转换为int
并转换为0 。
(参见 为什么 PHP 考虑0 等于字符串?)
如果这不是所需的行为,在进行非严格比较之前将数值转换为字符串可能会很方便:
The accepted solution (at the time of writing) by jwueller
Is perfectly correct but may have unintended behaviuor when doing weak comparison (the parameter
$strict = false
).Due to PHP's type juggling when comparing values of different type both
and
Evaluates
true
because"example"
is casted toint
and turned into0
.(See Why does PHP consider 0 to be equal to a string?)
If this is not the desired behaviuor it can be convenient to cast numeric values to string before doing a non-strict comparison:
这是我在 in_array 的 php 手册中找到的第一个此类函数。评论部分中的功能并不总是最好的,但如果它不起作用,您也可以查看那里:)
This is the first function of this type that I found in the php manual for in_array. Functions in the comment sections aren't always the best but if it doesn't do the trick you can look in there too :)
这是我的建议基于 json_encode() 解决方案,其中:
如果未找到单词,它仍然返回等于false的0。
希望有帮助。
Here is my proposition based on json_encode() solution with :
If word not found, it still returns 0 equal to false.
Hope it helps.
我正在寻找一个函数,可以让我在数组(haystack)中搜索字符串和数组(如针),所以我添加到 @jwueller 的回答。
这是我的代码:
I was looking for a function that would let me search for both strings and arrays (as needle) in the array (haystack), so I added to the answer by @jwueller.
Here's my code:
我使用此方法适用于任意数量的嵌套并且不需要黑客攻击
I used this method works for any number of nested and not require hacking
请尝试:
我不确定是否需要,但这可能适合您的要求
Please try:
Im not sure about the need, but this might work for your requirement
它也可以首先从原始数组创建一个新的一维数组。
It works too creating first a new unidimensional Array from the original one.
较短的版本,用于基于数据库结果集创建的多维数组。
如果 $os_list 数组的 os_version 字段中包含“XP”,则返回。
Shorter version, for multidimensional arrays created based on database result sets.
Will return if the $os_list array contains 'XP' in the os_version field.
array_search 怎么样?根据 https://gist.github.com/Ocramius/1290076 ,它似乎比 foreach 快得多..
what about array_search? seems it quite faster than foreach according to https://gist.github.com/Ocramius/1290076 ..
我发现了非常小的简单解决方案:
如果你的数组是:
那么代码将是这样的:
I found really small simple solution:
If your array is :
then the code will be like:
我发现以下解决方案代码不是很干净,但它有效。它用作递归函数。
I have found the following solution not very clean code but it works. It is used as an recursive function.
许多这样的搜索通常是为了在记录列表中查找内容,正如一些人指出的那样,这实际上是一个二维数组。
这是针对具有统一键集的记录列表,例如从数据库中抓取的记录列表等。
为了完整性,该结构包含“in_array”和“key_exists”样式的函数。这两个函数都返回一个简单的真/假布尔答案。
二维记录数组示例...
功能:
测试:
Many of these searches are usually for finding things in a list of records, as some people have pointed out is really a 2-dimensional array.
This is for a list of records that have a uniform set of keys) such as a list of records grabbed from a database, among other things.
Included are both 'in_array' and 'key_exists' styled functions for this structure for completeness. Both functions return a simple true/false boolean answer.
Example 2-dimensional array of records...
Functions:
Tests:
你可以这样使用
http://php.net/manual/tr/function .array-intersect.php
you can use like this
http://php.net/manual/tr/function.array-intersect.php