За последние 24 часа нас посетили 17767 программистов и 1676 роботов. Сейчас ищут 949 программистов ...

Обработка массива

Тема в разделе "Прочие вопросы по PHP", создана пользователем korjik, 30 янв 2015.

  1. korjik

    korjik Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    2
    Симпатии:
    0
    Всем привет! У меня такой вопрос:
    Имеется файл с таким вот содержанием:

    • Авто
      Авто/Автокосметика
      Авто/Автокосметика/Автошампуни
      Авто/Автокосметика/Автоэмали
      Авто/Автокосметика/Грунтовка
      Авто/Автокосметика/Очистители
      Авто/Автокосметика/Полироли
      Авто/Автокосметика/Шпатлевка
      Авто/Автохимия
      Авто/Автохимия/Антикоры
      Авто/Автохимия/Антифризы
      Авто/Автохимия/Герметики
      Авто/Автохимия/Жидкости для ГУР
      Авто/Автохимия/Масло трансмиссионное
      Авто/Автохимия/Моторные масла
      Авто/Автохимия/Присадки в масло
      Авто/Автохимия/Присадки в топливо
      Авто/Автохимия/Промывки и промывочное масло
      Авто/Автохимия/Смазки
      Авто/Автохимия/Тормозные жидкости

    Файл я обрабатываю вот так:
    Код (Text):
    1.  
    2. $result = array();
    3. $content = file('test.txt', FILE_IGNORE_NEW_LINES);
    4. foreach ($content as $line) {
    5.     $data = mb_split('/', $line);
    6.     $link = &$result;
    7.     foreach ($data as $item) {
    8.         if (!isset($link[$item])) {
    9.             $link[$item] = array();
    10.         }
    11.         $link = &$link[$item];
    12.     }
    13. }
    В $result теперь массив. Но мне нужно сделать так,чтобы у каждого элемента были ключи id, parent_id, и name. Один ссылается на другой. Надеюсь понятно объяснил задачу..
    P.S: Либо перегнать все это в Nested Sets, было бы вообще замечательно
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    П.М.С.М. у тебя на выходе не очень качественный массив. В нем часть элементов со слешем, а часть без слешей.

    Я бы привел данные к такому виду, чтобы можно было буквально искать (псевдокод)
    Код (PHP):
    1. foreach ($items as $id => $str) {
    2.   // ... $name = последний сегмент str
    3.   // ... $parent_name = str без последнего сегмента;
    4.   $parent_id = array_search($parent_name, $items);
    5.   // ... сохраняем id, parent_id, name
    6. }
    Добавлено спустя 11 минут 39 секунд:
    Моё полное решение: http://phpfiddle.org/lite/code/0fjx-z5ah

    Добавлено спустя 6 минут 38 секунд:
    Ну а преобразование AL в NS это популярная тема в интернетах. Вот побыстрому нагуглил:
    https://github.com/Humen/Tree
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вместо
    $items = array_filter(array_map('trim', $items), 'strlen');
    можно добавить флаг FILE_SKIP_EMPTY_LINES в file()
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    FILE_SKIP_EMPTY_LINES "непустые" строки из одних пробелов всосёт, а мну от них избавляется ;)
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
  6. korjik

    korjik Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    2
    Симпатии:
    0
    Спасибо!