Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过多个索引引用PHP数组_Php_Arrays_Multidimensional Array - Fatal编程技术网

通过多个索引引用PHP数组

通过多个索引引用PHP数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,这可能是一种奇怪的较长的捷径,如果我在这个思路上错了,请纠正我 我有一个数据矩阵,看起来像: unique_id | url | other random data... unique_id | url | other random data... unique_id | url | other random data... 我希望能够通过它的url或它的唯一id引用一个项目-有没有一种奇特的方法可以做到这一点 我想作弊的解决办法是只制作两个数组,但我想知道是否有更好的方法 试试这样的方法:

这可能是一种奇怪的较长的捷径,如果我在这个思路上错了,请纠正我

我有一个数据矩阵,看起来像:

unique_id | url | other random data...
unique_id | url | other random data...
unique_id | url | other random data...
我希望能够通过它的url或它的唯一id引用一个项目-有没有一种奇特的方法可以做到这一点


我想作弊的解决办法是只制作两个数组,但我想知道是否有更好的方法

试试这样的方法:

function selectByIdOrURL($array, $data) {
    foreach($array as $row) {
       if($row['unique_id'] == $data || $row['url'] == $data) return $row;
    }
    return NULL;
}

$array = array(
           array('unique_id' => 5, 'url' => 'http://blah.com'),
           array('unique_id' => 3, 'url' => 'http://somewhere_else.com')
         );
$found = selectByIdOrURL($array, 5); //array('unique_id' => 5, 'url' => 'http://blah.com')
$nfound = selectByIdOrURL($array, 10); //NULL

我能想到的唯一不涉及每次搜索都迭代数组的方法(参见Jacob的答案)是将对每个项的引用存储在两个数组中

编辑:由于URL和ID不会冲突,它们可能存储在同一个引用数组中(谢谢Matthew)

您可能可以使用一个实现
getById()
getByUrl()
的集合类来很好地封装它。在内部,它可以根据需要将引用存储在尽可能多的数组中


当然,您在这里主要做的是创建索引结果集,最好留给数据库管理系统处理。

对象肯定是最简单的方法吗

class Item {
    public $unique_url;
    public $url;
    public $other_data;

    public function __construct($unique_url, $url, $other_data)
    {
        $this->unique_url = $unique_url;
        $this->url = $url;
        $this->other_data = $other_data;
    }
}



class ItemArray {
    private $items = array();

    public function __construct()
    {
    }

    public function push(Item $item)
    {
        array_push($items, $item); //These may need to be reversed
    }

    public function getByURL($url)
    {
        foreach($items as $item)
        {
            if($item->url = $url)
            {
                return $item;
            }
        }
    }

    public function getByUniqueURL($url)
    {
        foreach($items as $item)
        {
            if($item->unique_url = $unique_url)
            {
                return $item;
            }
        }
    }

}
那就用它吧

$itemArray = new ItemArray();
$item = new Item("someURL", "someUniqueURL","some other crap");
$itemArray->push($item);

$retrievedItem = $itemArray->getItemByURL("someURL");

由于对象的创建,这种技术会有一点额外的开销,但除非你的行数达到了疯狂的程度,否则它就没问题了。

看来你的高级解决方案只有在PHP5.5时才可用。 您可以结合使用和在一行代码中获取条目:

$items = [
    [
     'unique_id' => 42,
     'url' => 'http://foo.com'
    ],
    [
     'unique_id' => 57,
     'url' => 'http://bar.com'
    ],
    [
     'unique_id' => 36,
     'url' => 'http://example.com'
    ],

];

$bar = $entries[array_search(57, array_column($items, 'unique_id'))];

var_dump($bar);

//outputs
array (size=2)
    'unique_id' => int 57
    'url' => string 'http://bar.com' (length=14)

是迭代数据的唯一方法吗?我想这没什么大不了的,但我真的很好奇你是否可以为数组建立多个索引(一般来说)@Bob,不,没有办法为数组建立多个索引。一般来说,没有。最快的方法(访问时间)是有两个数组,一个是唯一的_id作为键,另一个是URL,两者都以所有数据作为值。Jacob的答案将使用更少的内存,但每次引用某个内容时都需要迭代整个数组;我的方法将使用稍多的内存,但检索结果的速度会更快。真遗憾。。。我想只是迭代并不是那么糟糕任何花哨的解决方案都会涉及到幕后的迭代。不是真的,不。只是做两个数组。开销是最小的(当然,这取决于你的数组有多大)。一旦“随机数据”在数组中,你需要修改它吗?唯一的id和URL是否可能发生冲突?不要重复“其他随机数据”(“干燥”概念)。最干净的解决方案是使用一个数组将
unique\u id
映射到
其他随机数据
,然后使用第二个数组将
url
映射到
unique\u id
。这就是
unique\u id
s的目的:提供一个简洁高效的“句柄”,表示给定的数据记录(行)。此外,如果您选择,您可以将它们放在相同的数组中(例如
$items
)。这可能有点让人困惑,但鲍勃说钥匙不会碰撞。哦,这很有趣。它们不会发生冲突,但从漏洞的角度来看似乎有点可怕(例如,强制使用url而不是唯一的_id进行查找)。好技术though@Bob这类似于使用
fetch\u both
方法检索数据库记录,其中结果同时包含数字和字符串索引。说到索引,如果这些数据确实来自数据库,您最好将索引应用于ID和url字段,并进行单次抓取以检索指定的记录。@MatthewFlaschen-您可以将它们放在同一个数组中,但更干净的做法是使用第二个数组将
url
映射到
unique\ID
。把不同的概念分开。
$items = [
    [
     'unique_id' => 42,
     'url' => 'http://foo.com'
    ],
    [
     'unique_id' => 57,
     'url' => 'http://bar.com'
    ],
    [
     'unique_id' => 36,
     'url' => 'http://example.com'
    ],

];

$bar = $entries[array_search(57, array_column($items, 'unique_id'))];

var_dump($bar);

//outputs
array (size=2)
    'unique_id' => int 57
    'url' => string 'http://bar.com' (length=14)