2013-05-18 3 views
0

У меня есть этот массив:Поиск в массиве

$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 в нем?

Я пробовал: in_array("apple", $fruits) и это не сработало.

Я также пробовал различный синтаксис и немного испортил array_key_exists(), но ничего не получилось. Есть идеи?

+0

вы можете использовать 'in_array();' –

+0

Я попытался in_array(), я думаю, самое лучшее решение, как за все ответы, я получаю это цикл Еогеаспа .. – Mustapha

+0

контроля мой ответа. Я использовал 'foreach()' и 'in_array()' –

ответ

3

В таких случаях PHP, как известно, громоздкий. Лучшее многоборье решения является простым foreach:

$found = false; 
foreach ($fruits as $fruit) { 
    if ($fruit['name'] == 'apple') { 
     $found = true; 
     break; 
    } 
} 

if ($found) .... 

Вы можете написать это в ряде сексуальнее способов, но все они требуют дополнительного выделения памяти и/или будет медленнее; многие из них также будут сложнее понять, если вы не очень опытные.

+0

@PeeHaa 埽 Нет, он этого не сделал, код абсолютно прав? – bwoebi

+0

Это будет работать, только если вы знаете, каким будет имя последнего ключа. Что, если в массиве было 1000 ключей верхнего уровня, и вы хотели увидеть, где в нем содержится «оранжевый». Если имя было «мандарин», а цвет был «оранжевым», этот код пропустил бы его. Массив структурирован. $ fruits [0] ['name'] == apple. Если вы не пройдете через [0,1,2 ... и т. Д.], Это не сработает, потому что первый цикл foreach выполняет только итерацию по первому ключу с определенным ключом после него. –

+0

@Unipartisandev: Я понятия не имею, о чем вы говорите. Вопрос решает найти фрукты * по имени *. Мы не заботимся о других ключах. – Jon

0

Попробуйте это:

<?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'; 

?> 

Codepad Demo>>

1
foreach($fruits as $fruit) 
{ 
    /*In first loop $fruit = array('name'=>'banana', 'color'=>'yellow' , 
     'shape'=>'cylinder') 
    */ 
    if(in_array("apple",$fruit)) 
    { 
     /*Using in_array() function we don't have to worry about array keys. 
     The function checks whether the value exists in given array. 
     Returns TRUE if value is found in the array, FALSE otherwise. 
     if(in_array("apple",$fruit)) checks for TRUE 
     */ 

     //Do something 
    } 
} 

in_array(): http://php.net/manual/en/function.in-array.php
Еогеасп(): http://php.net/manual/en/control-structures.foreach.php

+0

Не могли бы вы объяснить свой код? – Fabio

+0

Я тестировал его, и он работает. Он короче кода моего ответа, и он повторяется на нескольких уровнях ключей, в отличие от других ответов. –

+0

@Fabio: обновили решение с объяснением. Если у вас все еще есть сомнения, я с удовольствием помогу –

1
$hasApple = false; 
foreach ($fruits as $subArray) { 
    if ($subArray['name'] == "apple") 
     $hasApple = true; 
} 

Это нормальное решение, просто. Вы также можете попробовать array_map($fruits, function() use (&$hasApple) { /* ... */ }). (Но это может быть медленнее ...)

В РНР 5.5 есть возможные один вкладыш:

$hasApple = in_array("apple", array_column($fruits, "name")); 
+0

+1 для 'array_column', хотя с гигантским предупреждением: лучше быть уверенным, что это не большой массив, потому что вы будете платить за удобство с одной лайнер-плюс-читаемость с кровью. ;-) – Jon

+0

@Jon Для маленьких массивов array_column примерно в 3 раза медленнее, но для больших массивов всего 2 раза (я просто сравнивал это ...) – bwoebi

+0

@Jon 'php bench_array_column_in_array.php => array_column: 243 secs foreach : 122 secs' с массивом из 3 миллионов записей и циклом 100 раз (и использование памяти максимально удваивает размер массива) – bwoebi

1
<?php 

$fruits = array(
    array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), 
    array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'), 
    array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere') 
); 

$result = false; 

foreach($fruits as $subarray) { 
    if(in_array('apple', $subarray)) { 
     $result = true; 
     break; 
    } 
} 

echo "result is ", ($result ? "TRUE" : "FALSE"); 

?> 
+0

Что делать, если вы ищете оранжевый цвет, но яблоко имеет оранжевый цвет? –

+0

Возвращает 'true'. Главный вопрос заключался в том, чтобы найти любой массив _apple_ в массиве, чтобы не найти элемент, имя которого - _apple_. – furas

0
$hasapple = 0; 
foreach($fruits as $keynum) 
{ 
    foreach($keynum as $fruitinfokey => $value) 
     { 
     if($value == "apple") 
      { 
      echo "fruits contains " . $value; 
      $hasapple = 1; 
      } 
} 
} 

if($hasapple == 0) 
    { 
    echo "The array $fruits does not contain apple"; 
    } 

Поместите петлю Еогеасп внутри другого цикла Еогеасп для поиска через расширенные ключи.

0
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"; 
} 
+0

Это хорошо, но что, если бы я хотел поискать цвет? Вам нужно будет отредактировать функцию. Сделайте это так: function arraySearch ($ value, $ array, $ type = 'name') ... then if ($ val [$ type] === $ value. –

+0

no вы можете передать другой аргумент в функции arraySearch ($ value, $ array, $ type) и проверить условие с if ($ val [$ type] === $ value) –

+0

Это именно то, что я сказал, за исключением того, что у меня есть тип $ со значением по умолчанию, необходимость. –