Добрый день. Стоит следующая задача(условия упрощу, чтобы попытаться верно донести информацию): На вход дан CSV файл, из которого мы выдираем: row[0],row[1],row[2]; row[0] - Фамилия (Бывает, что они дублируются); row[1] - Фамилия второго работника(Работают в группе); row[2] - Вид работ (Названия разные, но выходит две классификации: Подключение и Ремонт ); На выходе мне нужно получить следующее: Фамилия |Ремонтных_работ|Подключений Иванов | 10 | 5 Петров | 7 | 11 До этого работал с Java, и там бы решил данную задачу с помощью коллекций. Гуглил, но не смог найти collection framework на php. Задачу решил с помощью идиотского алгоритма, трех временных массивов и т.д. Хотелось бы увидеть ваше решение, дабы я не пошел по "неправильному пути".ъ Благодарю.
Код (PHP): $in = array( array('Иванов', 'Петров', 'Подключение'), array('Петров', 'Сидоров','Ремонт'), array('Сидоров','Сидоров','Ремонт'), array('Иванов', 'Петров', 'Подключение'), ); $out=array(); foreach($in as $row) { if (!isset($out[$row[0]][$row[2]])) { $out[$row[0]][$row[2]] = 0; } if (!isset($out[$row[1]][$row[2]])) { $out[$row[1]][$row[2]] = 0; } $out[$row[0]][$row[2]] += 1; $out[$row[1]][$row[2]] += 1; } echo '<pre>'; print_r($out);
туда же Код (PHP): $in = array( array('Иванов', 'Петров', 'Ковыряние отверткой'), array('Петров', 'Сидоров', 'Тяжка шланга'), array('Мардадзе', 'Сидоров', 'Курение'), array('Сидоров', 'Сидоров', 'Стучанье молотком'), array('Иванов', 'Петров', 'Курение'), array('Мардадзе', 'Петров', 'Подъем на этаж'), array('Иванов', 'Петров', 'Тяжка шланга'), ); //Учитывая что пхп позволяет делать длинные ключи - сделаем ход конём $worktypes = array( 'Ковыряние отверткой' => 'Ремонт', 'Тяжка шланга' => 'Подключение', 'Курение' => 'Ремонт', 'Стучанье молотком' => 'Ремонт', 'Подъем на этаж' => 'Подключение', ); $out = array(); foreach ($in as $row) { if (!isset($out[$row[0]][$worktypes[$row[2]]])) { $out[$row[0]][$worktypes[$row[2]]] = 0; } if (!isset($out[$row[1]][$worktypes[$row[2]]])) { $out[$row[1]][$worktypes[$row[2]]] = 0; } $out[$row[0]][$worktypes[$row[2]]]++; $out[$row[1]][$worktypes[$row[2]]]++; } var_dump($out);
это АД. для запросов есть язык SQL. почему бы не импортировать CSV в, скажем, SQLite и потом простым и элегантным запросом не получить нужную выборку? м? допустим в колонке job_fix будет 1 если это ремонт, иначе 0. аналогично колонка job_link для поключений: Код (Text): SELECT emp_name, SUM(job_fix), SUM(job_link) FROM jobs GROUP BY emp_name наверняка завтра понадобится еще какая-то выборка по тем же данным -- например ограничение по дате -- напишем еще один простой и элегантный запрос.
Благодарю. Третий вариант - наиболее рациональный. Подошел к задаче - созданием временной таблицы) Всем спасибо.
если планируется еще много делать хитрых выборок - загнать в бд возможно рационально. но в данном случае, для конкретной задачи описанной ТС - один прогон цикла, один массив. скрипт пишется за 5 мин. а плодить лишние сущности, парсить и перекладывать в БД, создавать временные таблицы, изучать особеннности БД, учиться писать запросы SQL... путь очень долгий - для человека который с этим не работал до этого. так что тут нельзя быть настолько категоричным
Только для расширения горизонтов автора: в PHP есть удобные функции array_map и array_filter. в сочетании с замыканиями они дают простой и элегантный способ изобразить из себя сервер БД Видимо на Java ты привык к подобному подходу, ну с поправкой на тотальную объектность джавы.