将这些数据存储在变量中的最佳方法是什么?

时间:2010-12-13 21:52:17

标签: php arrays variables

一些快速背景信息:我正在编写一个网站,将书籍与他们所需的课程相匹配。

我需要在代码中表示两个数据 - 哪些书与哪些类以及这些书上的数据(标题,作者,定价等)一起使用。

目前,我用两个数组代表这一切:$classArray$Books_data

这种方法相对于单变量方法的优势在于我不重复自己 - 如果不同类别需要多次书籍,则只需要将ISBN存储在$classArray中我可以将数据存储在$Books_array中。这个优势特别尖锐,因为我必须动态查询API的定价数据。如果我只有$classBooksArray,我必须将查询响应循环到一个大数组中,不必要地重复自己(看似)。

这种方法的缺点是这些变量几乎到处都是像连体双胞胎一样。几乎每个需要一个的功能都需要另一个功能。我的编码蜘蛛侠意识告诉我可能没必要。

那么,存储这些数据的最佳方法是什么?我没有提到的两个数组,一个数组或其他方法(例如通过引用传递)。

5 个答案:

答案 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是书籍表的外键(第三个表作为一个类有几本书)。我可能会坚持使用当前的实现,因为在需要的时候很容易转换到数据库(并且它通常比预期的更快)。

编辑:评论,说它已经存在于数据库中......我不明白为什么你想要在内存中存储一​​个完整的数据库,而不是只保留必要的内容当前的任务。