Необходимо извлечь данные из файла и сформировать ассоциативный массив — PHP task. Конкретная задача со stackoverflow:
1) Парсится какой-то книжный интернет магазин, в результате образуется текстовый файл (одна строка — одна книга). Поля в строке разделены между собой двумя и более пробелами.
The Boys in the Boat Daniel James Brown 067002581X 19.99 5 16.99 9 16.99 Harry Potter and the Cursed Child J. K. Rowling, Jack Thorne, John Tiffany 1338099133 18.95 25 17.98 0 17.98 Just Mercy Bryan Stevenson 0812994520 17.50 8 16.25 10 16.25 Me Before You Jojo Moyes 0670026603 18.95 2 17.50 1 17.25 A Thousand Splendid Suns Khaled Hosseini 1594489505 19.00 7 15.50 4 14.95 The Wright Brothers David McCullough 1476728742 21.95 3 18.95 3 18.95
2) Необходимо в результате обработки файла получить ассоциативный массив определенной структуры.
# code ... // на выходе должно быть $books = array( "The Boys in the Boat" => array ( "author" => 'Daniel James Brown', "isbn" => '067002581X', "hardcover" => 19.99, "quantity" => 5, "softcover" => 5.99, "quantity" => 9, "e-book" => 6.99, ), "Jungle" => array ( "author" => 'Upton Sinclair', "isbn" => '067002581', "hardcover" => 19.99, "quantity" => 5, "softcover" => 5.99, "quantity" => 7, "e-book" => 6.99, ), );
Решение задачи:
- Создать массив с ключами(автор, номер по каталогу, жесткая обложка …)
- С помощью стандартной функции file построчно прочитать файл в массив
- Регулярным выражением разделить каждый элемент полученного массива и положить во временный массив. Деление по двум и более пробелам.
- Первый элемент полученного массива — это название книги, он является ключом результирующего массива book
- Остальные элементы функцией array_combine «склеиваем» с массивом ключей
- Построчно формируем результирующий массив
# code ... $keyarray = ["author", "isbn", "hardcover", "quantity", "softcover", "quantity", "e-book"];// temp array names keys $array = file('text.txt');// нужно прочитать построчно foreach ($array as $key => $value) { $temparray = preg_split( '/ {2,}/', $value);// разделить строку по двум и более пробелам / {2,}/g $namebook = array_shift($temparray); // извлекаем название книги и укорачиваем массив на один элемент $books[$namebook] = array_combine($keyarray, $temparray); // склеиваем массив с ключами и новый массив }