PHP ассоциативный массив и файлы — PHP шаг за шагом

massive-150x150-8229368Необходимо извлечь данные из файла и сформировать ассоциативный массив — 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

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

  1. Необходимо в результате обработки файла получить ассоциативный массив определенной структуры.

# 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, ), );

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# 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,

        ),

     );

Решение задачи:

  1. Создать массив с ключами(автор, номер по каталогу, жесткая обложка …)
  2. С помощью стандартной функции file построчно прочитать файл в массив
  3. Регулярным выражением разделить каждый элемент полученного массива и положить во временный массив. Деление по двум и более пробелам.
  4. Первый элемент полученного массива — это название книги, он является ключом результирующего массива book
  5. Остальные элементы функцией array_combine «склеиваем» с массивом ключей
  6. Построчно формируем результирующий массив

# 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); // склеиваем массив с ключами и новый массив }

# 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); // склеиваем массив с ключами и новый массив

}

Лучший справочник по PHP

github-bb449e0ffbacbcb7f9c703db85b1cf0b-300x111-5199468