Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在数组中搜索_Php_Arrays - Fatal编程技术网

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倍(我刚刚做了基准测试…@Jon
php 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倍(我刚刚做了基准测试…@Jon
php 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";
}