通过多个索引引用PHP数组

时间:2010-12-10 03:04:17

标签: php arrays multidimensional-array

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

我有一个数据矩阵,如下所示:

unique_id | url | other random data...
unique_id | url | other random data...
unique_id | url | other random data...

我希望能够通过它的url引用一个项目,或者它的unique_id - 是否有一种奇特的方式来做到这一点?

我认为作弊解决方案只是制作两个阵列,但我想知道是否有更好的方法。

4 个答案:

答案 0 :(得分:10)

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

编辑:由于网址和ID无法冲突,因此可能会将它们存储在同一参考数组中(感谢Matthew)

$items; // array of item objects
        // Use objects so they're implicitly passed by ref

$itemRef = array();

foreach ($items as $item) {
    $itemRef[$item->unique_id] = $item;
    $itemRef[$item->url] = $item;
}

// find by id
$byId = $itemRef[$id];

// find by url
$byUrl = $itemRef[$url];

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

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

答案 1 :(得分:1)

尝试这样的事情:

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

答案 2 :(得分:1)

您的花哨解决方案似乎仅在 PHP 5.5 时可用。 您可以结合使用array_searcharray_column在一行代码中获取您的条目:

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

答案 3 :(得分:0)

当然,一个物体是一种简单的方法吗?

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

由于对象创建,这种技术有一点额外的开销,但除非你做了疯狂的行数,否则没关系。