readData(); $employees = array(); // 各行のデータを 'id', 'name', 'email' の連想配列に変換する foreach ($rows as $row) { $employees[] = $this->convertRowToEmployee($row); } return $employees; } catch (Exception $e) { throw new RuntimeException("社員情報の取得に失敗しました: " . $e->getMessage(), 0, $e); } } /** * 新規登録(INSERT) * @param array $data ['name' => '...', 'email' => '...'] の連想配列 * @return bool 登録成功時true * @throws InvalidArgumentException データが不正な場合 * @throws RuntimeException データ書き込みに失敗した場合 */ public function add($data) { // カプセル化: バリデーションロジックをprivateメソッドで隠蔽 $this->validateEmployeeData($data); try { // TODO:既存データを取得 // TODO:新しいIDを生成 // TODO:CSVファイルに新規データを追加する処理 // CSVファイルに書き込み return $this->writeData(); } catch (Exception $e) { throw new RuntimeException("社員情報の登録に失敗しました: " . $e->getMessage(), 0, $e); } } /** * 更新(UPDATE) * @param string|int $id 更新する社員のID * @param array $data ['name' => '...', 'email' => '...'] の連想配列 * @return bool 更新成功時true * @throws InvalidArgumentException データが不正な場合 * @throws RuntimeException データ書き込みに失敗した場合、またはIDが見つからない場合 */ public function update($id, $data) { // カプセル化: バリデーションロジックをprivateメソッドで隠蔽 $this->validateEmployeeData($data); // IDが指定されていない場合はエラー if (empty($id)) { throw new InvalidArgumentException("IDが指定されていません"); } try { // CSVファイルから全データを取得 $rows = $this->readData(); // 指定されたIDの社員が見つかったかをフラグで管理 $found = false; // TODO: foreachを使い、$rows の各行を参照渡しでチェックして、$id と一致する行の 'name' と 'email' を更新する // TODO: 見つかったらフラグを立てる // TODO: 見つからなければエラー // 見つからなければエラー if (!$found) { throw new RuntimeException("指定されたIDの社員が見つかりません: " . $id); } // CSVファイルに書き込み return $this->writeData($rows); } catch (RuntimeException $e) { throw $e; } catch (Exception $e) { throw new RuntimeException("社員情報の更新に失敗しました: " . $e->getMessage(), 0, $e); } } /** * 削除(DELETE) * @param string|int $id 削除する社員のID * @return bool 削除成功時true * @throws InvalidArgumentException IDが指定されていない場合 * @throws RuntimeException データ書き込みに失敗した場合、またはIDが見つからない場合 */ public function delete($id) { // TODO: ゼロから実装しましょう } /** * CSV行データを社員情報の連想配列に変換する(カプセル化: privateメソッド) * @param array $row CSVの1行データ * @return array ['id' => ..., 'name' => ..., 'email' => ...] の連想配列 */ private function convertRowToEmployee($row) { return array( 'id' => isset($row[0]) ? $row[0] : '', 'name' => isset($row[1]) ? $row[1] : '', 'email' => isset($row[2]) ? $row[2] : '' ); } /** * 社員データのバリデーション(カプセル化: privateメソッド) * @param array $data バリデーション対象のデータ * @throws InvalidArgumentException データが不正な場合 */ private function validateEmployeeData($data) { if (!is_array($data)) { throw new InvalidArgumentException("データは配列である必要があります"); } if (!isset($data['name']) || empty(trim($data['name']))) { throw new InvalidArgumentException("名前が指定されていません"); } if (!isset($data['email']) || empty(trim($data['email']))) { throw new InvalidArgumentException("メールアドレスが指定されていません"); } // メールアドレスの形式チェック if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException("メールアドレスの形式が正しくありません"); } } /** * 新しいIDを生成する(カプセル化: privateメソッド) * @param array $rows 既存のデータ行 * @return string 生成されたID */ private function generateId($rows) { // 既存のIDの最大値を取得して+1する方式 $maxId = 0; foreach ($rows as $row) { if (isset($row[0]) && is_numeric($row[0])) { $maxId = max($maxId, (int)$row[0]); } } return (string)($maxId + 1); } }