Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Индексы в массивах

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: быстрая навигация
eai
Отправлено: 28 Марта, 2012 - 13:16:29
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Всем доброго времени дня

суть задачи такая:
в системе много объектов которые имеют связи между собой
Пример
объекты A, B, C, D
A связан с B и С
В связан с А и D
С связан с A и D
D связан с B и C

уже здесь видно что у нас произошло дублирование данных при описании.
По сути надо выделить таблицу связей в "нормализованной" форме
например так
PHP:
скопировать код в буфер обмена
  1.  
  2. $links = array();
  3. $links[$A][$B] = true;
  4. $links[$A][$C] = true;
  5. $links[$B][$D] = true;
  6. $links[$C][$D] = true;
  7.  


Казалось бы все связи описаны, но возникает проблема навигации и быстрого поиска.
Как для известного объекта узнать все его связи?
Если для объекта A ответом является массив $links[$A], то для объекта $D придется перебирать все.

Есть ли какое то красивое решение этой задачи?

(Отредактировано автором: 28 Марта, 2012 - 13:18:51)

 
 Top
AdMeen
Отправлено: 28 Марта, 2012 - 13:26:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




Связи один-ко-многим и многие-ко-многим вполне реально реализовать через любую БД.

Если стоит задача реализации именно через массивы, то что мешает использовать хэши вида
CODE (htmlphp):
скопировать код в буфер обмена
  1. $o2m = Array('a'=>Array('b','c'),'b'=>Array('A','D'));
 
 Top
eai
Отправлено: 28 Марта, 2012 - 13:30:50
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Мешает избыточность и необходимость париться с поддержкой целостности.
Сам подумываю о таком варианте на базе trait (нужен 5.4)
Примешивать связь к объектам. Но ... надеюсь что есть что то более красивое и менее громозткое
 
 Top
AdMeen
Отправлено: 28 Марта, 2012 - 13:36:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




eai пишет:
Мешает избыточность и необходимость париться с поддержкой целостности.


Избыточность? Целостность? Тогда используйте для задач подходящие инструменты, где за всем этим будут следить за вас. На данный момент вы пытаетесь ломом лужу вычерпать.
 
 Top
eai
Отправлено: 28 Марта, 2012 - 13:42:45
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




[quote=AdMeen]
eai пишет:
Тогда используйте для задач подходящие инструменты, где за всем этим будут следить за вас. На данный момент вы пытаетесь ломом лужу вычерпать.

А что так грубо то?
 
 Top
AdMeen
Отправлено: 28 Марта, 2012 - 13:46:09
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




eai пишет:
Тогда используйте для задач подходящие инструменты, где за всем этим будут следить за вас. На данный момент вы пытаетесь ломом лужу вычерпать.

А что так грубо то?[/quote]


Извиняюсь, если в моем посте увидели грубость.


Просто не стоит выдумывать очередной велосипед
 
 Top
EuGen Администратор
Отправлено: 28 Марта, 2012 - 15:48:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Простой пример:
PHP:
скопировать код в буфер обмена
  1. interface Linker
  2. {
  3.     public function createLink(Linker $rNewLink);
  4.     public function hasLink(Linker $rLink);
  5.     public function getLinks();
  6.     public function removeLink(Linker $rLink);
  7. }

- и реализация (в предположении, что идентификаторы узлов всегда есть строки):
PHP:
скопировать код в буфер обмена
  1. class Node implements Linker
  2. {
  3.    protected $_rgLinks=array();
  4.    private $__internalName='';
  5.  
  6.    public function __construct($internalName=null)
  7.    {
  8.       $this->__internalName=$internalName;
  9.    }
  10.  
  11.    public function __toString()
  12.    {
  13.       return $this->__internalName;
  14.    }
  15.  
  16.    public function createLink(Linker $rNewLink)
  17.    {
  18.       if((string)$this==(string)$rNewLink || in_array((string)$rNewLink, $this->_rgLinks))
  19.       {
  20.          return false;
  21.       }
  22.       $this->_rgLinks[]=(string)$rNewLink;
  23.       $rNewLink->createLink($this);
  24.       return true;
  25.    }
  26.  
  27.    public function hasLink(Linker $rLink)
  28.    {
  29.       return in_array((string)$rLink, $this->_rgLinks);
  30.    }
  31.  
  32.    public function getLinks()
  33.    {
  34.       return $this->_rgLinks;
  35.    }
  36.  
  37.    public function removeLink(Linker $rLink)
  38.    {
  39.       if(($iKey=array_search((string)$rLink, $this->_rgLinks))===false)
  40.       {
  41.           return false;
  42.       }
  43.       unset($this->_rgLinks[$iKey]);
  44.       $rLink->removeLink($this);
  45.       return true;
  46.    }
  47. }

Использовать это применительно к задаче можно, например, так:
PHP:
скопировать код в буфер обмена
  1. $a = new Node('A');
  2. $b = new Node('B');
  3. $c = new Node('C');
  4. $d = new Node('D');
  5. $a->createLink($b);
  6. $a->createLink($c);
  7. $c->createLink($d);
  8. $b->createLink($d);
  9.  
  10. var_dump($a->getLinks());


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
eai
Отправлено: 28 Марта, 2012 - 15:58:12
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Евгений, это специально для меня написали или у вас уже было?

P.S.
Я примерно тому же склонялся но не люблю интерфейсы поэтому думал про traits
 
 Top
EuGen Администратор
Отправлено: 28 Марта, 2012 - 16:00:56
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Нет, не было. Написано для этой задачи.
Разумнее, чем хранить список связей для каждого объекта в нем самом - я не вижу решения. А чтобы не было трудностей с контролем целостности, я считаю уместнее всего поручить эту проблему реализации (что и было сделано).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
eai
Отправлено: 28 Марта, 2012 - 16:12:48
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Ох и не лень вам было ...

За открывающуюся скобку с новой строки особый респект Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB