$file = '1::сергей::петров 2::иван::иванов 3::катя::воронина';
preg_match_all('/(?<id>\d+)::(?<name>[^::]*)::(?<surname>[^\d]*)/', $file, $match);
foreach ($match['id'] as $key => $value) {
$newarr[$value] = ['name' => $match['name'][$key], 'surname' => $match['surname'][$key]];
}
print_r($newarr);
Array
(
[1] => Array
(
[name] => сергей
[surname] => петров
)
[2] => Array
(
[name] => иван
[surname] => иванов
)
[3] => Array
(
[name] => катя
[surname] => воронина
)
)
elem
и пытаетесь его использовать, у вас такая же ошибка как у пациентаtext.length+1