Задать вопрос
@samlewis

Как найти часть массива в массивах?

Добрый день.
Подскажите, пожалуйста, всю голову сломал.
Нужно найти $needle в $arr и вернуть этот элемент $arr.
array_search() и in_array не работают, думаю нужно что-то посложнее.
$needle = array(
	'Alias' => 'alias',
	'Parent' => 'parent'
);
$arr = array(
	array(
		'ID' => 1,
		'Alias' => 'alias',
		'Parent' => 'parent'
	),
	array(
		'ID' => 2,
		'Alias' => 'alias2',
		'Parent' => 'parent2'
	),
	array(
		'ID' => 3,
		'Alias' => 'alias3',
		'Parent' => 'parent3'
	)
);
$search = array_search($needle,$arr);
var_dump($search);
  • Вопрос задан
  • 2987 просмотров
Подписаться 3 Оценить 1 комментарий
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
$search = array_filter($arr, function (array $item) use ($needle) {
    foreach($needle as $key => $value) {
        if (!isset($item[$key]) || $item[$key] !== $value) {
             return false;
        }
    }

    return true;
}


И еще вариантик....

$search = array_filter($arr, function (array $item) use ($needle) {
     return $needle == array_intersect_key($item, $needle);
}


и еще один... если вам надо индекс найти... это же и для in_array будет работать если вам нужно только проверить.
$search = array_search($needle, array_map(function (array $item) use ($needle) {
    return array_intersect_keys($item, $needle);
}, $arr, false),


Обновил код, перепутал местами аргументы для array_intersect_key.

Добавляю быструю реализацию. Быстрее выше перечисленных (кроме первой) раз в 6.
$search = [];
foreach ($arr as $item) {
    if ($needle == array_intersect_key($item, $needle)) {
        $search[] = $item;
    }
}
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
так как искомый массив не совпадает с массивами в списке, то он и не находится.
Вам нужно перебором вашего $arr напрямую проверять, не нашёлся ли нужный.
foreach ($arr as $i => $a) {
  if ($needle['Alias']==$a['Alias'] && $needle['Parent']==$a['Parent']) {
    // $a - ваш искомый подмассив
    doSomething($a);
    break;
  }
}

Если в массиве-списке может быть несколько совпадений, то убрать команду break;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
foreach ($arr as $ar) {
        if(($ar['Alias'] == $needle['Alias']) && ($ar['Parent']==$needle['Parent'])) {
        echo $ar['ID'];
        }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы