@samuser
programmer

Как из двух массивов сделать один двумерный массив?

есть два массива
$users = array(array('id' => 1, 'name' =>  "Александр"),
                 array('id' =>2, 'name' =>  "Сергей"),
                 array('id' => 3, 'name' =>  "Никита"),
                 array('id' => 4, 'name' =>  "Володя"));
 
  $punch = array(array('id' => 1,  'user_id' => 1, 'start' =>  "08:48:00", 'stop' =>  "12:00:00", 'date' =>  "2018-02-01"),
                 array('id' =>2, 'user_id' => 2, 'start' =>  "08:05:00", 'stop' =>  "18:00:00", 'date' =>  "2018-02-01"),
                 array('id' => 3, 'user_id' => 3, 'start' =>  "08:18:00", 'stop' =>  "13:20:00", 'date' =>  "2018-02-01"),
                 array('id' => 1, 'user_id' => 1, 'start' =>  "13:18:00", 'stop' =>  "18:48:00", 'date' =>  "2018-02-01"),
                 array('id' => 3, 'user_id' => 3, 'start' =>  "13:58:00", 'stop' =>  "18:48:00", 'date' =>  "2018-02-01"),
                 array('id' => 4, 'user_id' => 4, 'start' =>  "08:20:00", 'stop' =>  "18:15:00", 'date' =>  "2018-02-01"));
 
 Как мне из этих двух массива сделать один массив виде ?
 
 $multiarray = array('Александр'=>
                            array(
                                array( 'start' =>  "08:48:00", 'stop' =>  "12:00:00", 'date' =>  "2018-02-01"),
                                array( 'start' =>  "13:18:00", 'stop' =>  "18:48:00", 'date' =>  "2018-02-01")
                                ),
                    
                    'Сергей'=>
                            array(
                                array( 'start' =>  "08:05:00", 'stop' =>  "18:00:00", 'date' =>  "2018-02-01")
                                ),
                                
                    'Никита'=>
                            array(
                                array( 'start' =>  "08:18:00", 'stop' =>  "13:20:00", 'date' =>  "2018-02-01"),
                                array( 'start' =>  "13:58:00", 'stop' =>  "18:48:00", 'date' =>  "2018-02-01")
                                ),
                                
                    'Володя'=>
                            array(
                                array( 'start' =>  "08:20:00", 'stop' =>  "18:15:00", 'date' =>  "2018-02-01"),
                                array( 'start' =>  "13:58:00", 'stop' =>  "18:48:00", 'date' =>  "2018-02-01")
                                )
                    );
  • Вопрос задан
  • 318 просмотров
Пригласить эксперта
Ответы на вопрос 1
gromdron
@gromdron
Работаю с Bitrix24
В Вашем случае есть 2 ограничения:
1) Если у Вас будет 2 пользователя с одинаковым именем, то их данные смешаются в одну кучу
2) Если немного изменить формат $users то будет значительно проще получить результирующий массив (не нужен будет первый цикл на ассоциативность)

/**
 * Шаг 1 - разворачиваем $users в плоский массив
 * Если есть возможность получить его сразу ассоциативным,
 * то это было бы лучше
 */
$usersAssoc = [];

foreach ($users as $user)
{
	$usersAssoc[ $user['id'] ] = $user['name'];
}

/**
 * Шаг 2 - выполяем группирующее преобразование наших $punch
 */
$result = [];

foreach ($punch as $time)
{
	if ( !array_key_exists($time['user_id'], $usersAssoc) )
	{
		// В punch есть массив, который относится к пользователю
		// о окотором мы не знаем
		continue;
	}

	$result[ $usersAssoc[ $time['user_id'] ] ][ $time['id'] ] = $time;
}


echo "<pre>";
var_dump($result);
echo "</pre>";
Ответ написан
Ваш ответ на вопрос

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

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