【问题标题】:What is the best way to define a large array of data in PHP?在 PHP 中定义大量数据的最佳方法是什么?
【发布时间】:2011-10-24 01:44:27
【问题描述】:

我有一个 PHP 应用程序,它需要大型 2D 硬编码数据数组。我目前只是在一个脚本中定义了这个,该脚本包含在每个脚本执行的开头。

我想知道是否有人对此有更好的想法。

我的脚本如下所示。除了我有更多的行并且每行有更多的字段。

function getData() {
    return array(
        1 => array('name'=>'a something', 'price'=>123, 'field1'=>1, 'field2'=>3, 'field3'=>2),
        2 => array('name'=>'b something', 'price'=>123, 'field1'=>3, 'field2'=>3, 'field3'=>2),
        3 => array('name'=>'c something', 'price'=>234, 'field1'=>2, 'field2'=>3, 'field3'=>2),
        4 => array('name'=>'d something', 'price'=>345, 'field1'=>8, 'field2'=>3, 'field3'=>2),
        5 => array('name'=>'e something', 'price'=>655, 'field1'=>12, 'field2'=>3, 'field3'=>2),
        6 => array('name'=>'f something', 'price'=>124, 'field1'=>11, 'field2'=>3, 'field3'=>2),
    );
}

每一行都有相同的字段。所以它很像一个 DB 表结果集。我想我可以把它放在数据库表中,但我发现这个脚本更容易编辑,而且我认为它运行起来比查询数据库要快得多。

我目前的解决方案的问题是它可能很难阅读,因为有很多字段。我想要的是一个易于阅读和编辑的系统,但它也必须非常快。

数据库表会更好吗?或者也许从电子表格中读取 CSV 文件?

【问题讨论】:

  • 如果它相对不变,为什么不用memcache?
  • 其实memcache是​​个不错的选择。它不能解决可读性/可编辑性,但意味着我可以将数据放在电子表格/CSV 中,然后使用 memcache 快速处理。
  • @Jared Farrish:如果它相对不变,为什么要使用内存缓存?
  • @hakre - 我在考虑静态内存可用性,但现在考虑一下,这可能有点过头了(是的,memcache 是为动态数据构建的......)。在不知道数据的真实大小的情况下,可能很难知道将数据加载到内存中的其他方法是否“足够高效”。不过,我在想的是加载到内存中的时间。
  • @JaredFarrish: 如果你把它作为一个数组放入代码中,当代码执行时它已经被加载了:)

标签: php arrays csv


【解决方案1】:

一般而言,以任何方便的方式写入数据,可能是 CSV 或类似的方式。创建一个可以将该数据处理为您需要的格式的函数。缓存处理后的数据,这样就不需要每次都这样做了。

function getData() {
    $cache = 'data.dat';

    if (file_exists($cache)) {
        return unserialize(file_get_contents($cache));
    }

    $data = <<<DATA
a something, 123, 1, 3, 2
b something, 123, 3, 3, 2
...
DATA;

    $data = array_map(function ($row) {
        $row = array_map('trim', explode(',', $row));
        return array_combine(array('name', 'price', 'field1', 'field2', 'field3'), $row);
    }, explode("\n", $data));

    file_put_contents($cache, serialize($data));
    return $data;
}

在上面的例子中,我只是使用一个 HEREDOC 字符串来存储数据。您可能希望将其放入外部 CSV 文件或 XML 文件中,您可以从某处或任何适合您需要的地方自动生成。

如果它非常大,将其存储在数据库中可能是一个更好的主意。像 SQLite 这样轻量级的东西就可以了。

【讨论】:

  • 谢谢,我喜欢这个答案。我会做这样的事情。我可能会使用 memcache 来缓存数据(正如 Jared Farrish 所建议的)而不是文件,因为如果我更改数据,这样会更容易清除缓存。
  • 附言。抱歉,我还没有足够的声望,所以不能投票 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2012-04-30
  • 2012-04-25
  • 2012-04-21
  • 1970-01-01
  • 2018-02-01
相关资源
最近更新 更多