group by make_name,
MIN(p2.cost)
foreach(array_unique(array_column($data,'fio')) as $name){ // вот здесь мы перебираем всех юзеров....
echo "<tr><td>$name</td>";
foreach($allDates as $day){ // здесь выводим для них часы
foreach($data as $i){
if($i['fio']==$name && $i['date']==$day && print("<td>{$i['cha']}</td>"))
continue 2;
}
echo "<td>-</td>";
}
// вот здесь часы уже выведены и если мы хотим добавить что-то еще (переработку или длину х...., то здесь это делать самое время.). Значит сюда можно добавить еще один foreach и в случае совпадения id создать еще один столбец. А если совпадений нет , то все равно создать , но сделать его пустым (чтобы наша таблица не сломалась).
echo "</tr>";
\\*
$argumentValue = new Regex('^\\*a6$', 'i');$argumentValue = new Regex('^.*\\*a6$', 'i');$argumentValue = new Regex('^ *\\*a6$', 'i');
// но это выглядит странно. проще было бы показать несколько образцов строки которые вам надо найти.
$data = [
['fio'=>'Kolya', 'date'=>'12.12.19', 'cha'=>'12']....$data = [
[ "users_id"=>11 , "name"=> "Человек3", "date"=>"2019-05-17", "user_id"=>13,
"sub_hours"=>8......
] ......
Пример