Php 在数组中搜索
我有这个阵列:Php 在数组中搜索,php,arrays,Php,Arrays,我有这个阵列: $fruits = array( [0] => array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), [1] => array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'), [2] => array('name'=>'orange', 'color'=>
$fruits = array(
[0] => array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'),
[1] => array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'),
[2] => array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere')
)
如何确定数组$fruits
中是否已包含apple
我试过:在数组中(“apple”,“$fruits”)
但没有成功
我还尝试了各种语法,并在
array\u key\u exists()
中弄乱了一点,但没有任何效果。有什么想法吗?PHP在这种情况下是出了名的笨拙。最好的全面解决方案是一个简单的foreach:
$found = false;
foreach ($fruits as $fruit) {
if ($fruit['name'] == 'apple') {
$found = true;
break;
}
}
if ($found) ....
你可以用很多更性感的方式来写,但是所有这些方式都需要额外的内存分配和/或更慢;如果你不是很有经验的话,其中很多问题也很难理解。PHP在这种情况下是出了名的笨拙。最好的全面解决方案是一个简单的foreach:
$found = false;
foreach ($fruits as $fruit) {
if ($fruit['name'] == 'apple') {
$found = true;
break;
}
}
if ($found) ....
你可以用很多更性感的方式来写,但是所有这些方式都需要额外的内存分配和/或更慢;如果你不是很有经验,其中很多问题也会更难理解。试试以下方法:
<?PHP
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
$b = array(array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'),array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere'));
echo in_array_r("apple", $b) ? 'found' : 'not found';
?>
试试这个:
<?PHP
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
$b = array(array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'),array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere'));
echo in_array_r("apple", $b) ? 'found' : 'not found';
?>
在数组()中:
foreach(): 在数组()中:
foreach(): 这是正常的解决方案,很简单。您还可以尝试使用
array\u-map($fruits,function()use(&$hasaapple){/*…*/})
。(但这可能会慢一些……)
从PHP 5.5开始,可以使用一行程序:
$hasApple = in_array("apple", array_column($fruits, "name"));
这是正常的解决方案,很简单。您还可以尝试使用array\u-map($fruits,function()use(&$hasaapple){/*…*/})
。(但这可能会慢一些……)
从PHP 5.5开始,可以使用一行程序:
$hasApple = in_array("apple", array_column($fruits, "name"));
将一个foreach循环放在另一个foreach循环中,以搜索扩展的键
function arraySearch($value, $array) {
foreach ($array as $key => $val) {
if ($val['name'] === $value) {
return true;
}
}
return null;
}
if(arraySearch('apple',$fruits)){
echo "yes found";
}else{
echo "not found";
}
将一个foreach循环放在另一个foreach循环中,以通过扩展键进行搜索。您可以在_array()中使用
代码>我在_array()中尝试过,根据我得到的所有答案,我想最好的解决方案是foreach循环..签出我的答案。我使用了foreach()
和in_array()
@Mustapha如果您使用PHP5.4或更低版本,这是我能想到的最好的解决方案。但是从PHP5.5开始,有一个更好的方法(见我的帖子)。@Mustapha用demo检查我的答案。。你可以在_array()中使用代码>我在_array()中尝试过,根据我得到的所有答案,我想最好的解决方案是foreach循环..签出我的答案。我使用了foreach()
和in_array()
@Mustapha如果您使用PHP5.4或更低版本,这是我能想到的最好的解决方案。但是从PHP5.5开始,有一个更好的方法(见我的帖子)。@Mustapha用demo检查我的答案。+1查看array\u column
,尽管有一个巨大的警告:你最好确保它不是一个大数组,因为你将为一行代码以及良好的可读性和方便性支付费用。;-)@Jon对于小数组,数组列大约慢3倍,但是对于大数组,只慢2倍(我刚刚做了基准测试…@Jonphp bench\u array\u column\u in\u array.php=>array\u column:243 secs foreach:122 secs
,数组有300万个条目,循环100次(最大内存使用量是数组大小的两倍)是的,对于小型数组(比方说少于100项),我完全可以在自己的代码中完成这项工作——事实上,我有一个自定义函数,它模拟array\u column
,并且已经这样做了。我只是说,我们需要意识到这些权衡。也许这听起来比我的意思更可怕。array\u column
的+1,尽管有一个巨大的警告:你最好确保它不是一个大数组,因为你将为一行加上良好的可读性和方便性而支付血钱。;-)@Jon对于小数组,数组列大约慢3倍,但是对于大数组,只慢2倍(我刚刚做了基准测试…@Jonphp bench\u array\u column\u in\u array.php=>array\u column:243 secs foreach:122 secs
,数组有300万个条目,循环100次(最大内存使用量是数组大小的两倍)是的,对于小型数组(比方说少于100项),我完全可以在自己的代码中完成这项工作——事实上,我有一个自定义函数,它模拟array\u column
,并且已经这样做了。我只是说,我们需要意识到这些权衡。也许这听起来比我的意思更可怕。如果你搜索橙色,但苹果有橙色呢?它返回true
。主要的问题是在数组中找到任何一个苹果,而不是找到名为apple的元素。如果搜索橙色,但苹果是橙色的,会怎么样?它返回true
。主要的问题是找到数组中的任何一个苹果,而不是找到名为apple的元素。我测试了它,它运行正常。它比我的答案的代码短,并且它在多个级别的键上进行了迭代,这与其他答案不同。@Fabio:已用解释更新了解决方案。如果你还有疑问,我很乐意回答help@Unipartisandev:谢谢。:)我测试过了,它能用。它比我的答案的代码短,并且它在多个级别的键上进行了迭代,这与其他答案不同。@Fabio:已用解释更新了解决方案。如果你还有疑问,我很乐意回答help@Unipartisandev:谢谢。:)只有当您知道最后一个键的名称时,这才有效。如果数组有1000个顶级键,您想看看其中是否有“橙色”键,该怎么办。如果名称为“橘子色”,颜色为“橙色”,则此代码将丢失它。数组是结构化的$水果[0]['name']==苹果。如果不经过[0,1,2…etc],它将不起作用,因为第一个foreach循环只在第一个键上迭代,后面有一个已定义的键。@unipartsandev:我不知道你在说什么。这个问题涉及按名称查找水果。我们不在乎其他钥匙。@Jon;我不是故意刁难,我只是针对提问者的问题:“我如何才能发现数组$FROUTS中是否已经包含苹果?”如果['shape']=='apple'但['name']没有,该怎么办?数组$fruits将包含
function arraySearch($value, $array) {
foreach ($array as $key => $val) {
if ($val['name'] === $value) {
return true;
}
}
return null;
}
if(arraySearch('apple',$fruits)){
echo "yes found";
}else{
echo "not found";
}