我想做类似以下的事情。
$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向量索引。
答案 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对象仍可用于正常分配或单键查询。