如何在二维数组中搜索?

时间:2017-04-11 08:44:10

标签: php arrays performance search

我有一个看起来像这样的数组:

array(500) {
[1]=>
  array(4) {
    ["name"]=>
    string(17) "Final Fantasy VII"
    ["price"]=>
    string(5) "11.69"
    ["shop"]=>
    string(4) "9507"
    ["url"]=>
    string(77) "https://de.gamespl...."
  }
[2]=> ...

我想根据价格,商店,网址和名称检查指定游戏是否仍然存在于此阵列中。我现在的问题是,如何搜索数组?

因为我没有游戏的ID,所以要困难得多,因为数组会像[1] => array (4) ... [2] => ...那样堆叠起来。 是否有更好的方法来堆叠阵列? - 没有ID存储产品有什么好处? - 它会加速搜索吗?

因为我的重点是速度/优化,我需要以最快的方式完成此搜索...因为我必须检查5000个游戏,我需要最快的方式。

有没有人有想法或者可以告诉我哪一种是最快的方式以及如何搜索这个数组?

2 个答案:

答案 0 :(得分:1)

你可以这样做,首先获取所需的所有列,然后在你的数据中搜索完整的数组。

PHP code demo

<?php

ini_set("display_errors", 1);
$array=array(
    array(
        "name"=> "x",
        "price"=> "12000",
        "shop"=> "212121",
        "url"=> "http://www.someurl.com",
    ),
    array(
        "name"=> "xy",
        "price"=> "11000",
        "shop"=> "1212121",
        "url"=> "http://www.someotherurl.com",
    )
);
// date need to search for 
$gameName="xy";
$gamePrice="11000";
$gameURL="http://www.someotherurl.com";
$gameId="1212121";

//Creating array from data for searching.
$dataToSearch=array(
    "name"=> "xy",
    "price"=> "11000",
    "url"=> "http://www.someotherurl.com",
    "shop"=> "1212121",
);
if(in_array($dataToSearch, $array))
{
    echo "Game found!";
}

答案 1 :(得分:1)

在这种情况下,最佳方法是使用isset哈希查找而不是in_array。由于引物具有O(1)(一般)和前O(n)。这意味着in_array搜索时间取决于数组的长度。您可以阅读有关Big-O Complexity的更多信息。

要使用isset,我们必须将array_map应用于数组。在我们的例子中,我们使用json_encode来创建密钥。

function encodeGame($game)
{
    return json_encode([
        $game["name"],
        $game["price"],
        $game["shop"],
        $game["url"],
    ]);
}

$games = array_combine(array_map('encodeGame', $games), $games);

var_dump(isset($games[encodeGame($game1)]));
var_dump(isset($games[encodeGame($game2)]));

这是working demo