2010-04-22 4 views
4

У меня есть массив следующим образомПоиск значений в массиве вложенных

array(2) { 
    ["operator"] => array(2) { 
    ["qty"] => int(2) 
    ["id"] => int(251) 
    } 
    ["accessory209"] => array(2) { 
    ["qty"] => int(1) 
    ["id"] => int(209) 
    } 
    ["accessory211"] => array(2) { 
    ["qty"] => int(1) 
    ["id"] => int(211) 
    } 
} 

Я пытаюсь найти способ, чтобы проверить значение идентификатора существует в пределах массива и возврата BOOL. Я пытаюсь найти быстрый способ, который не требует создания цикла. Использование функции in_array не работало, и я также читал, что он довольно медленный.

В руководстве по php кто-то рекомендовал использовать flip_array(), а затем isset(), но я не могу заставить его работать для массива 2-го уровня.

делать что-то вроде

if($array['accessory']['id'] == 211) 

также будет работать для меня, но мне нужно, чтобы соответствовать все ключи, содержащие аксессуар - не знаю, как сделать это

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

+0

Одной из функций PHP, которые я собирался предложить, была «array_walk_recursive», которая не требовала бы, чтобы вы выполняли цикл. Однако эта функция не работает, если ваш 'ключ' имеет значение массива, как и ваш. Петля, возможно, единственный способ. Могу ли я спросить, почему без петель? –

+0

@ Энтони Форлони: Я немного смущен. Эта функция должна делать именно то, что хочет OP. Можете ли вы объяснить, почему это не сработает? Единственная проблема, которую я вижу, заключается в том, что она проведет все значения, даже если совпадение уже найдено. –

+0

Хорошо, когда я проверяю, существует ли это значение, оно уже перебирает все значения для идентификатора (содержащегося в объекте) для соответствия. Я просто пытаюсь сократить время поиска. – dardub

ответ

5

Эй, dardub, вы можете использовать array_walk для проверки того, находится ли конкретное значение внутри вашего массива. Array_walk выполняет итерацию через al-элементы вашего массива и применяет к ним предоставленную функцию, поэтому вам в основном нужно будет создать эту функцию. Она используется следующим образом:

$arr = array(
    'one' => array('id' => 1), 
    'two' => array('id' => 2), 
    'three' => array('id' => 3) 
); 

function checkValue($value, $key) 
{ 
    echo $value['id']; 
} 

array_walk($arr, 'checkValue'); 

Вам просто нужно добавить к вашей функции независимо от/валидация Условные вам нужно.

Надеюсь, что это поможет.

М.

EDIT: PHP документы на array_walk http://www.php.net/manual/en/function.array-walk.php

+1

Вы должны добавить ссылку на документацию, а также указать, что вы можете передать третий параметр в 'array_walk', который снова будет передан функции обратного вызова (т. Е. Это способ передать' id' для поиска). –

+0

Могу ли я вернуть функцию bool? У меня проблемы с работой? – dardub

+0

array_walk возвращает true или false, но в зависимости от того, был ли выполнен обратный вызов или нет, вы можете использовать флаг a (глобальную переменную), чтобы указать, было ли найденное вами значение найденным или нет. – falomir

1

Эта функция полезна in_array(211, $array['accessory']); Она проверяет весь указанный массив в чтобы увидеть, если значение существует там и возвращает истину.

in_array

0
$map = array(); 
foreach ($arr as $v) { 
    $map[$v['id']] = 1; 
} 
//then you can just do this as when needed 
$exists = isset($map[211]); 

Или, если вам нужны данные, связанные с ним

$map = array(); 
foreach ($arr as $k => $v) { 
    $map[$v['id']][$k] = $v; 
} 
print_r($map[211]); 
0
<?php 

//PHP 5.3 way to do it 

function searchNestedArray(array $array, $search, $mode = 'value') { 

    foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key => $value) { 
     if ($search === ${${"mode"}}) 
      return true; 
    } 
    return false; 
} 

$data = array(
    array('abc', 'ddd'), 
    'ccc', 
    'bbb', 
    array('aaa', array('yyy', 'mp' => 555)) 
); 

var_dump(searchNestedArray($data, 555)); 
0

Я использовал статический метод, потому что я нуждался в классе, но если вы хотите, вы можете используйте его как простую функцию.

/** 
* Given an array like this 
* array(
* 'id' => "first", 
* 'title' => "First Toolbar", 
* 'class' => "col-md-12", 
* 'items' => array(
*  array(
*   'tipo' => "clientLink", 
*   'id' => "clientLinkInsert" 
*  ) 
* ) 
*) 
* 
* and array search like this 
* array("items", 0, "id") 
* 
* Find the path described by the array search, in the original array 
* 
* @param array $array source array 
* @param array $search the path to the item es. ["items", 0, "tipo"] 
* @param null|mixed $defaultIfNotFound the default value if the value is not found 
* 
* @return mixed 
*/ 
public static function getNestedKey($array, $search, $defaultIfNotFound = null) 
{ 
    if(count($search) == 0) return $defaultIfNotFound; 
    else{ 
     $firstElementSearch = self::array_kshift($search); 

     if (array_key_exists($firstElementSearch, $array)) { 
      if(count($search) == 0) 
       return $array[$firstElementSearch]; 
      else 
       return self::getNestedKey($array[$firstElementSearch], $search, $defaultIfNotFound); 
     }else{ 
      return $defaultIfNotFound; 
     } 
    } 
} 
Смежные вопросы