За последние 24 часа нас посетил 17491 программист и 1727 роботов. Сейчас ищут 940 программистов ...

Сделать двумерный массив из одномерного, полученного php-оператором file

Тема в разделе "PHP для новичков", создана пользователем forever_young, 8 июн 2017.

  1. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Добрый день всем!
    Я беру txt-файлы при помощи file("name.txt"). Все эти файлы ВСЕГДА имеют вид:

    Понедельник
    ...
    ...
    Вторник
    ...
    ...
    Среда
    ...
    и т.д.


    Одномерный массив, короче. Мне нужно из него сделать двумерный, чтобы потом со строками каждого дня работать отдельно. Должно получиться:

    $file = array(
    'понедельник' => array(
    '...',
    '...',
    '...'),
    'вторник' => array(
    '...',
    '...',
    '...'),
    'среда' => (
    '...',
    и т.д)

    Как это провернуть? Спасибо!
     
  2. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Можно, например, так:
    PHP:
    1. <?php
    2. function fileSplit($fliename, array $split = array('понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресение')) {
    3.     $data = file($filename);
    4.     $result = [];
    5.     $key = 'unknown';
    6.     foreach ($data as $row) {
    7.         $possibleKey = mb_strtolower(trim($row, "\r\n\t\0 "), 'utf-8');
    8.         if (in_array($possibleKey, $split)) {
    9.             $key = $possibleKey;
    10.             continue;
    11.         }
    12.         $result[$key][] = $row;
    13.     }
    14.  
    15.     return $result;
    16. }
    17. ?>
    P.S.: Код не проверял
     
    denis01 нравится это.
  3. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    К сожалению, не работает, по крайней мере у меня... Но все равно спасибо!
     
    denis01 нравится это.
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    denis01 нравится это.
  5. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Вот! (Дважды загрузилось...)
     

    Вложения:

    • disc_rus_s.txt
      Размер файла:
      4 КБ
      Просмотров:
      6
    • disc_rus_s.txt
      Размер файла:
      4 КБ
      Просмотров:
      2
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    PHP:
    1. <?php
    2.  
    3. $lines = file('disc_rus_s.txt', FILE_IGNORE_NEW_LINES);
    4. $days = [];
    5. $prev = $day = null;
    6.  
    7. foreach ($lines as $line) {
    8.     $line = trim($line);
    9.     if ($prev === '') {
    10.         $day = $line;
    11.         $days[$day] = [];
    12.     } elseif (isset($day) && $line !== '') {
    13.         $days[$day][] = $line;
    14.     }
    15.     $prev = $line;
    16. }
    17.  
    18. var_export($days);
    --- Добавлено ---
    или как конечный автомат
    PHP:
    1. <?php
    2.  
    3. $lines = file('disc_rus_s.txt', FILE_IGNORE_NEW_LINES);
    4. $days = [];
    5. $state = null;
    6.  
    7. foreach ($lines as $line) {
    8.     $line = trim($line);
    9.     if (strlen($line) == 0) {
    10.         $state = 'WANT DAY';
    11.         continue;
    12.     }
    13.     switch ($state) {
    14.         case 'WANT DAY':
    15.             $day = $line;
    16.             $days[$day] = [];
    17.             $state = 'WANT ROW';
    18.             break;
    19.         case 'WANT ROW':
    20.             $days[$day][] = $line;
    21.             break;
    22.     }
    23. }
    24.  
    25. var_export($days);
     
  7. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Содержимое файла:
    Код (Text):
    1. Discovery Russia (Сокращенно)
    2.  
    3. Понедельник, 12 Июня
    4. 09:00, 01:00, 04:50 Выжить любой ценой 16+
    5. 10:00, 16:30, 22:30, 06:55 Как это устроено? 12+
    6. ...
     
  8. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Тут подвязано к пустой строке. А что если пустых строк нет?
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    а что если я тебя забаню, дружок ))) тут не тараканьи бега, а ты не повелитель тараканов.
     
  10. forever_young

    forever_young Новичок

    С нами с:
    24 мар 2017
    Сообщения:
    26
    Симпатии:
    2
    Что не так?