一些快速背景信息:我正在编写一个网站,将书籍与他们所需的课程相匹配。
我需要在代码中表示两个数据 - 哪些书与哪些类以及这些书上的数据(标题,作者,定价等)一起使用。
目前,我用两个数组代表这一切:$classArray
和$Books_data
。
这种方法相对于单变量方法的优势在于我不重复自己 - 如果不同类别需要多次书籍,则只需要将ISBN存储在$classArray
中我可以将数据存储在$Books_array
中。这个优势特别尖锐,因为我必须动态查询API的定价数据。如果我只有$classBooksArray
,我必须将查询响应循环到一个大数组中,不必要地重复自己(看似)。
这种方法的缺点是这些变量几乎到处都是像连体双胞胎一样。几乎每个需要一个的功能都需要另一个功能。我的编码蜘蛛侠意识告诉我可能没必要。
那么,存储这些数据的最佳方法是什么?我没有提到的两个数组,一个数组或其他方法(例如通过引用传递)。
答案 0 :(得分:1)
为什么不是一个有两个键的关联 - 一个指向一个类数组,一个存储书籍 数据?
$allData = array("classes" => &$classArray, "books" => &$Books_data);
通过这种方式,你只传递了一个变量(更少的混乱),但保留了书籍和类的独立数据存储的所有好处。
虽然,老实说,如果它只是两组数据,那么恕我直言你的蜘蛛感觉是错误的 - 将两者作为单独的参数传递是完全正常的。一旦你进入一组siamise sextuplet变量,那么上面的方法开始真正带来好处。
答案 1 :(得分:0)
多维数组。
$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);
答案 2 :(得分:0)
让我们成为OO并将数组放入一个对象中。定义具有这些属性的类,加载它并调用其方法。或者,如果您必须使用对象的数据操作其他函数,请传递实例。禁止直接访问数据,但提供了提取显着信息的方法。
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];
}
}
答案 3 :(得分:0)
您是否有理由不将此数据存储在数据库中,然后查询数据库?这是一个多对多的关系,你需要3个表 - class,book和class_book_intersection。
例如,你可以从列表中选择“select class”,列表是从类中的行派生的。
然后,如果选择的类ID是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
答案 4 :(得分:0)
如果您的数据是数据库,那么您当前的提案是正常形式将是规范的。这两个变量只是表格而ISBN是书籍表的外键(第三个表作为一个类有几本书)。我可能会坚持使用当前的实现,因为在需要的时候很容易转换到数据库(并且它通常比预期的更快)。
编辑:评论,说它已经存在于数据库中......我不明白为什么你想要在内存中存储一个完整的数据库,而不是只保留必要的内容当前的任务。