У меня есть массив следующим образом
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) } }
Я пытаюсь найти способ проверить значение id в массиве и вернуть bool. Я пытаюсь найти быстрый способ, который не требует создания цикла. Использование функции in_array не работало, и я также читал, что он довольно медленный.
В руководстве php кто-то рекомендовал использовать flip_array (), а затем isset (), но я не могу заставить его работать для 2-мерного массива.
делать что-то вроде
if($array['accessory']['id'] == 211)
также будет работать для меня, но мне нужно сопоставить все ключи, содержащие аксессуар, – не уверен, как это сделать
В любом случае, я вращаюсь по кругу и могу использовать некоторую помощь. Кажется, это должно быть легко. Благодарю.
Эй, 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 docs на array_walk http://www.php.net/manual/en/function.array-walk.php
Эта функция полезна in_array(211, $array['accessory']);
Он проверяет весь указанный массив, чтобы увидеть, существует ли там ваше значение и возвращает true.
in_array
$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]);
<?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));
Я использовал статический метод, потому что мне он нужен в классе, но если вы хотите, вы можете использовать его как простую функцию.
/** * 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; } } }