PHP:如何索引关联数组中的多个键?

时间:2015-01-21 10:10:42

标签: php multidimensional-array indexing

我打算建立一个简单的"使用PHP的RESTful Web服务。我将提供API来访问我在Web服务器上收集的一些数据(通过JSON)。主数据表对于公共API方法是只读的,并且将由常规定时间隔的单独私有方法编写。用户可以将一些数据写入私有表。

我想避免 - 如果可能的话 - 添加处理数据库的复杂性(甚至不是SQLite);所以,我打算在磁盘上的文件序列化我的数据,并在调用PHP脚本时在内存中反序列化它们。

在每个PHP实例的内存中加载整个数据不会给Web服务器带来太大的负担(我希望)... (数字是这样的:主数据表大小计划最多为100k记录,每个记录的最大记录大小为1k字节,因此数据大小最大可能大小为100MB,通常大小为10MB;最大并发用户数永远不会高于100;这些数字是由设计,没有可能变得更大)。

问题是:我可以使用PHP关联数组对多个键执行查询吗?

一个例子:这是我简化的主要数据结构:

<?php
    $data = [
        "1" => [
            "name" => "Alice",
            "zip" => "12345",
            "many" => "A",
            "other" => "B",
            "fields" => "C",
        ],
        "2" => [
            "name" => "Bob",
            "zip" => "67890",
            "many" => "X",
            "other" => "Y",
            "fields" => "Z",
        ],
        // ...
    ];
?>

要按主键访问记录,当然,我应该这样做:

$key = "12345";
$record = $data[$key];

但是,如果我想(有效地,即避免顺序扫描......)通过不同的密钥访问一个或多个记录,请说&#34; zip&#34;?当然,这些键可能包含重复的值。我想出的唯一解决方案是为每个二级密钥构建一个新数组,以及#34; index&#34;,并将其与主数据表一起序列化......

例如:

$zip_idx = [
    "12345" => [ "1", "355", "99999", ],
    "67890" => [ "2", "732", ],
    // ...
];

然后:

$zip = "67890";
$records = $zip_idx[$zip];

所以:
您是否认为此设计存在任何问题,不一致或缺乏灵活性? 您能提出更智能或更紧凑的解决方案吗? 您有任何考虑或反对意见吗?

1 个答案:

答案 0 :(得分:1)

我不会为其他“索引”创建任何进一步的数组。

只需创建一个很好的类来处理查询。 zip的查询可能看起来像这样

class Data{

    protected $data;

    public function getByZip($zip){
        return array_filter($this->getData(),function($item)use($zip){
             if($item['zip'] == $zip) return true;
             return false;
        });
    }

    public function setData($data){
        $this->data = $data;
    }

    public function getData($data){
        return $this->data;
    }
}

$dataArray = [
    "1" => [
        "name" => "Alice",
        "zip" => "12345",
        "many" => "A",
        "other" => "B",
        "fields" => "C",
    ],
    "2" => [
        "name" => "Bob",
        "zip" => "67890",
        "many" => "X",
        "other" => "Y",
        "fields" => "Z",
    ],
    // ...
];

$data = new Data();

$data->setData($dataArray);

$result = $data->getByZip(12345);

你也可以在数组中使用userid并以这种方式查询。

问候

编辑:针对您的效果问题 - &gt; 正常情况下,您可以使用数据库获取可达100MB的数据。 原因是 - 如果您使用阵列文件数据库 - 必须将100MB的整个文件读入内存。这不是一个问题,但大多数提供商使用的最大内存限制为128MB,这可能会导致问题。