deadloop
@deadloop
Активно осваиваю PHP

Как перебрать два массива?

Как перебрать два массива методом foreach так что-бы совпадающие данные из одного массива выводили совпадение другого

specId = 2 выводили из второго значения по id = 2

$arr1 = [
    1 => ['id' => 1, 'name' => 'DJ'],
    2 => ['id' => 2, 'name' => 'Bass'],
    3 => ['id' => 3, 'name' => 'Vocal'],
];

$arr2 = [
    ['name' => 'Alex', 'specId' => 1],
    ['name' => 'Tim', 'specId' => 2],
    ['name' => 'Dave',  'specId' => 2],
];
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 3
В зависимости от цели делать можно по разному.

1. Простой перебор вложенными циклами, в качестве результата выводим id совпадающих элементов.
$arr1 = [
            1 => ['id' => 1, 'name' => 'DJ'],
            2 => ['id' => 2, 'name' => 'Bass'],
            3 => ['id' => 3, 'name' => 'Vocal'],
        ];

        $arr2 = [
            ['name' => 'Alex', 'specId' => 1],
            ['name' => 'Tim', 'specId' => 2],
            ['name' => 'Dave',  'specId' => 2],
        ];

        $result = [];
        foreach ($arr1 as $arr1_item) {
            foreach ($arr2 as $arr2_item) {
                if ($arr1_item['id'] == $arr2_item['specId']) {
                    $result[$arr1_item['id']] = $arr1_item['id'];
                }
            }
        }

var_export($result);


2. Тоже перебор, но без явных циклов - комбинируем встроенные функции обработки массивов. В качестве результата возвращаем 1й массив, в котором оставлены только совпадающие со 2м элементы.

$arr1 = [
    1 => ['id' => 1, 'name' => 'DJ'],
    2 => ['id' => 2, 'name' => 'Bass'],
    3 => ['id' => 3, 'name' => 'Vocal'],
];

$arr2 = [
    ['name' => 'Alex', 'specId' => 1],
    ['name' => 'Tim', 'specId' => 2],
    ['name' => 'Dave',  'specId' => 2],
];

$result = array_filter($arr1, function ($item1) use ($arr2) {
    return in_array(
        true,
        array_map(function ($item2) use ($item1) {
            return $item2['specId'] == $item1['id'];
        }, $arr2)
    );
});
var_export($result);
Ответ написан
Комментировать
artzolin
@artzolin
php, WordPress разработка сайтов artzolin.ru
Вы можете из первого массива собрать новый, в котором ключом будет id, а значением name. Тогда получать значение по ключу станет гораздо проще:

$arr1 = [
		1 => ['id' => 1, 'name' => 'DJ'],
		2 => ['id' => 2, 'name' => 'Bass'],
		3 => ['id' => 3, 'name' => 'Vocal'],
	];

	$arr3 = array();
	foreach ( $arr1 as $key => $arr1_value ) {
		$arr3[$arr1_value['id']] = $arr1_value['name'];
	}

	$arr2 = [
		['name' => 'Alex', 'specId' => 1],
		['name' => 'Tim', 'specId' => 2],
		['name' => 'Dave',  'specId' => 3],
	];

	echo '<ul>';
		foreach ( $arr2 as $key => $arr2_value ) {
			echo '<li>' . $arr3[$arr2_value['specId']] . '</li>';
		}
	echo '</ul>';
Ответ написан
Комментировать
vechnokrainii
@vechnokrainii
ну почти всегда(
Либо я не понял до конца условия задачи, либо не понимаю зачем так сложно
$mass = array_column($arr1, 'name', 'id');
foreach ($arr2 as $val) {
    if(isset($mass[$val['specId']]))  {
        print_f($mass[$val['specId']]);
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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