是否有可能在PHP中使用多个索引?

时间:2011-04-02 14:05:52

标签: php

我想做类似以下的事情。

$ind=array('a','b','c');
$arr['a']=1;
$arr['b']=4;
$arr['c']=7;
$d= $arr[$ind];
print_r($d);

它显然无法工作,我想知道是否还有一种简单的方法可以在一行或两行代码中完成。

修改

这是一个更好的例子来证明我的意思。

$ind=array('a','c','b','d','e','a','a');
$arr['a']=1;
$arr['b']=4;
$arr['c']=7;
$d=$arr[$ind];

现在我想收到$ d等于1,7,4,1,1

array_intersect_key不起作用。或者至少我不能让它适合我。我在想array_walk和lamda函数。任何人吗?

注意:这个语法在Matlab中可用(好吧,差不多)。所以你可以输入:

arr=rand(20,1);
ind=[1 2 10 2 1 1];
newArr=arr(ind); 

并且它将产生长度为6的向量,其值由ind向量索引。

2 个答案:

答案 0 :(得分:2)

要获取$arr中具有与$ind中的值匹配的键的项目,您可以使用以下内容:

$arr = array('a' => 1, 'b' => 4, 'c' => 7);
$ind = array('a','c');
$d   = array_intersect_key($arr, array_flip($ind));
// $d = array('a' => 1, 'c' => 7);

array_flip()的调用只是“翻转”$ind中的键/值(使其看起来像array('a'=>0,'c'=>1)),然后我们找到与array_intersect_key()交叉的键返回第一个数组($arr)中具有与第二个数组匹配的键的项(翻转的$ind)。


修改mario's answer为基础(在撰写本文时已损坏,但未执行您想要的操作),您可以使用

class MultiIndex extends ArrayObject
{
    public function offsetGet($offset)
    {
        if (is_array($offset)) {
            $return = array();
            foreach ($offset as $o) {
                if ($this->offsetExists($o)) {
                    $return[] = parent::offsetGet($o);
                }
            }
            return $return;
        } else {
            return parent::offsetGet($offset);
        }
    }
}

$arr = new MultiIndex($arr);
$d = $arr[$ind];
// $d = array(1,7,4,1,1);

答案 1 :(得分:1)

更新:从salathe回来,我已经将方法压缩到实际需要的调用,$this[$i]已经隐式处理现有的数组键。再次删除了密钥捕获。


如果使用数组对象作为解决方法,则可以嵌入实用程序代码来完成此操作:

class MultiIndex extends ArrayObject {

    function offsetGet ($keys) {

            foreach ($keys as $i) {
                isset($this[$i]) and
                    $r[] = ArrayObject::offsetGet($i);
            }
            return $r;

    }
}

然后将数组转换为对象以使用多索引方法:

$arr = new MultiIndex($arr);
$d = $arr[$ind];

此$ arr对象仍可用于正常分配或单键查询。