Лучший способ сохранить эти данные в переменной? - PullRequest
1 голос
/ 14 декабря 2010

Краткая справочная информация: я кодирую сайт, который сопоставляет книги с классами, для которых они необходимы.

У меня есть две части данных, которые мне нужно представить в моем коде - которыес какими классами идут книги, а также данные (названия, авторов, цены и т. д.) этих книг.

В настоящее время я представляю все это с двумя массивами: $classArray и $Books_data.

Преимущество этого подхода перед подходом с одной переменной состоит в том, что я не повторяюсь - если для разных классов требуется книга несколько раз, в $classArray нужно хранить только ISBN, и я могусохранить данные в $Books_array.Это преимущество особенно важно, потому что мне приходится запрашивать данные о ценах у API на лету.Если бы у меня был только $classBooksArray, мне пришлось бы зацикливать ответы на запросы в большом массиве, повторяя себя (казалось бы) без необходимости.

Недостаток этого подхода в том, что эти переменные следуют друг за другом почти вездекак сиамские близнецы.Почти каждая функция, которая нуждается в одной, нуждается в другой.И мое чувство пауков в кодировании говорит мне, что это может быть ненужным.

Итак, как лучше всего хранить эти данные?Два массива, один массив или какой-то другой подход, который я не упомянул (например, передача по ссылке).

Ответы [ 5 ]

1 голос
/ 14 декабря 2010

Почему бы не ассоциативу, которая имеет два ключа - один указывает на массив классов, другой для хранения книг
данные

$allData = array("classes" => &$classArray, "books" => &$Books_data);

Таким образом, вы передаете только одну переменную (меньше беспорядка), но сохраняете все преимущества отдельных хранилищ данных для книг и классов.

Хотя, если честно, если это просто ДВА набора данных, то, ИМХО, ваше чувство пауков неверно - передача обоих параметров в отдельности - это прекрасно. Как только вы попадаете в набор переменных siamise sextuplet, описанный выше подход начинает приносить пользу.

0 голосов
/ 14 декабря 2010

Если бы ваши данные были базой данных, ваше текущее предложение, являющееся обычной формой, было бы каноническим.Две переменные просто станут таблицами, а ISBN станет внешним ключом таблицы книг (с третьей таблицей, поскольку в классе несколько книг).Я бы, вероятно, придерживался текущей реализации, поскольку ее будет очень легко преобразовать в базу данных, когда это будет необходимо (и обычно это происходит быстрее, чем ожидалось).

РЕДАКТИРОВАТЬ : комментарий,скажем, это уже есть в базе данных ... я не понимаю, почему вы хотите хранить полную базу данных в памяти, а не просто хранить то, что необходимо для текущей задачи.

0 голосов
/ 14 декабря 2010

Есть ли причина, по которой вы не сохраняете эти данные в базе данных, а затем запрашиваете базу данных? Это отношение многие ко многим, и вам потребуется 3 таблицы - class, book и class_book_intersection.

Так, например, у вас может быть «выбрать класс» из списка, где список получен из строк в классе.

Тогда, если выбран идентификатор класса 123. Запрос будет выглядеть примерно так:

Select  book.title,  book.cost
 from book 
inner join class_book_intersection
  on 
class_book_intersection.classid = 123 and  
class_book_intersection.bookid = book.bookid 
0 голосов
/ 14 декабря 2010

Давайте будем ОО и поместим массивы в объект.Определите класс с этими свойствами, загрузите его и вызовите его методы.Или, если вам нужны другие функции, работающие с данными объекта, передайте экземпляр.Запретить прямой доступ к данным, но предоставить методы для извлечения существенной информации.

class book_class_association {

   protected $books_to_classes = array();
   protected $classes_to_books = array();

   function __construct() {
      $this->books_to_classes = array(
         'mathbook1' => array('math'),
         'mathbook2' => array('math'),
      );
      $this->classes_to_books = array(
         'math' => array('mathbook1', 'mathbook2'),
      );
   }

   function classes_for_book( $class_name ) {
      return $this->books_to_classes[$class_name];
   }

   function books_for_class( $class_name ) {
      return $this->classes_to_books[$class_name];
   }

}
0 голосов
/ 14 декабря 2010

многомерный массив.

$collection = array(
    'classes' => array( /* Contents of $classArray */),
    'books' => array( /* Contents of $Books_data */)
);

function some_function($collection) {
    // looping over books
    foreach ($collection['books'] as $book) {
        // yadda yadda
    }
}

А еще лучше класс:

/* Define */
class Collection {
    private $books;
    private $classes;
    public function __construct($classes = array(), $books = array()) {
        $this->books = $books;
        $this->classes = $classes;
    }
    public function addBook($book) {
        $this->books[] = $book;
    }
    public function addClass($class) {
        $this->classes[] = $class;
    }
    public function get_classes() {
        return $this->classes;
    }
    public function get_books() {
        return $this->books;
    }
}
function some_function(Collection $col) {
    // looping over books
    foreach ($col->get_books as $book) {
        // yadda yadda
    }
}

/* Usage */
$collection = new Collection(); // you also could pass classes and books in the
                                // constructor.
$collection->addBook($book);
somefunction($collection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...