【问题标题】:Best way to store this data in a variable?将此数据存储在变量中的最佳方法是什么?
【发布时间】:2011-05-24 22:43:53
【问题描述】:

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

我有两条数据需要在我的代码中表示 - 哪些书与哪些类有关,以及这些书上的数据(标题、作者、定价等)。

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

与单变量方法相比,这种方法的优点是我不会重复自己——如果不同类需要多次使用一本书,则只需将 ISBN 存储在$classArray 中,我可以将数据存储在$Books_array 中。这个优势尤其显着,因为我必须即时从 API 中查询定价数据。如果我只有一个$classBooksArray,我将不得不将查询响应循环到一个大数组中,不必要地重复自己(似乎)。

这种方法的缺点是这些变量几乎无处不在,就像连体双胞胎一样。几乎每一个需要一个的功能,都需要另一个。而且我的编码感觉告诉我这可能是不必要的。

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

【问题讨论】:

  • 您有面向对象编程的经验吗?我的第一直觉认为这可以使用它来简化。您可以有一个名为 Class 的类,它可以“拥有”另一个名为 Book 的类的许多不同实例。两个班级可以轻松地共享数据库中的同一本书。
  • 嗯,这可能是最终的方向。对象方法在哪些方面比 DVK 建议的参考方法更好?
  • OOP 和非 OOP 之间的通常区别。您可以隐藏类的实现,以便以后可以在不破坏调用者代码的情况下更改类实现等...在这种特定情况下,OOP 方法可能有点矫枉过正,但我​​来自 Perl 世界,对象拜物教不是像在 Java 中一样流行,所以我倾向于只在真正需要的地方使用 OO ;)

标签: php arrays variables


【解决方案1】:

为什么不使用具有两个键的关联 - 一个指向类数组,一个指向存储书籍
数据?

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

这样,您只传递了 1 个变量(不那么混乱),但保留了书籍和课程单独数据存储的所有好处。

不过,老实说,如果只是两组数据,那么恕我直言,您的蜘蛛侠感觉是错误的 - 将两者作为单独的参数传递是完全可以的。一旦你进入一组连体六连音变量,那么上述方法就开始真正带来好处了。

【讨论】:

  • 如果您在 classArray 中使用引用,为什么还要将它们存储在同一个数组中?
  • @babonk - 正如我在答案中编辑的那样,如果只有 2 个,老实说,没有意义。如果有超过 2 个数据集,它就会开始结出硕果(以更清洁/更易于维护的代码的形式)。
  • @babonk - 同意。 @DVK - 我从事过一个经常这样做的项目,并且讨厌每一分钟都不知道哪个神奇的钥匙拥有哪个庞大的数据存储。对我来说可能是简洁高效的,但非常老套。
【解决方案2】:

一个多维数组。

$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);

【讨论】:

    【解决方案3】:

    如果您的数据是一个数据库,那么您当前的提案是一个正常的形式将是规范的。这两个变量将成为表,ISBN 是书表的外键(第三个表作为一个类有几本书)。我可能会坚持使用当前的实现,因为在必要时转换为数据库非常容易(而且通常比预期的要快)。

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

    【讨论】:

    • 我不会将完整的数据库存储在内存中,我会存储用户搜索过的课程/书籍
    【解决方案4】:

    让我们成为 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];
       }
    
    }
    

    【讨论】:

      【解决方案5】:

      您没有将这些数据存储在数据库中然后查询数据库是否有原因?这是多对多的关系,您需要 3 个表 - class 、 book 和 class_book_intersection。

      例如,您可以从列表中“选择类”,其中列表派生自类中的行。

      如果选择的类 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 
      

      【讨论】:

      • @Lill - 在某些时候,需要从数据库中检索数据并存储在内存中。
      • 对,我已经将它存储在数据库中了。问题是如何存储在内存中
      • @Lill:两张桌子应该足够了。一个定义书籍,ISBN 编码一个从类到书籍表的外键。
      • @babonk:如果它已经在数据库中,为什么要将它存储在内存中。你有很大的性能问题吗?
      • 这样我就可以向使用我网站的人展示它。 PS它实际上需要3张桌子,因为课程和书籍是多对多的
      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2021-04-13
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多