通过多个索引引用PHP数组

Jan*_*nda 6 php arrays multidimensional-array

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

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

unique_id | url | other random data...
unique_id | url | other random data...
unique_id | url | other random data...
Run Code Online (Sandbox Code Playgroud)

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

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

Phi*_*hil 11

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

编辑:由于URL和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];
Run Code Online (Sandbox Code Playgroud)

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

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


Jac*_*kin 3

尝试这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,没有。最快的方法(就访问时间而言)是使用两个数组,一个以 unique_id 作为键,另一个以 URL 为值,两个数组都以所有数据作为值。Jacob 的答案将使用稍少的内存,但每次引用某些内容时都需要迭代整个数组;我的方法将使用稍多的内存,但会更快地检索结果。 (3认同)
  • @Bob,不,没有办法为数组设置多个索引。 (2认同)