将数字索引数组转换为由这些索引编制索引的关联对象数组中的有序元素数组

时间:2012-10-13 22:51:46

标签: php arrays

注意:我应该清楚我的愿望是在一个声明中在功能上做到这一点。我可以使用循环轻松完成此操作,但这不是我感兴趣的内容。

我有两个数组:索引的数字数组A和关联数组B,对象O由数组A的元素索引。

我希望按照A元素的顺序生成一个O数组 - 换句话说,根据关联数组B将索引映射到实际对象。

例如:

A = [ 3, 4, 2, 1 ];
B = [ 1=>"one", 2=>"two", 3=>"three", 4=>"four" ]

我想:

[ "three", "four", "two", "one" ]

另外,顺便说一下,我也很想知道这个概念叫什么。它有点像映射,但具体涉及索引到另一个数组,而不是函数。

5 个答案:

答案 0 :(得分:4)

$A = array(3, 4, 2, 1);
$B = array(1=>"one", 2=>"two", 3=>"three", 4=>"four");

foreach($A as $i) $R[] = $B[$i]; 

var_dump($R);

答案 1 :(得分:1)

我只是添加一点,如果有人仍然对使用“array_map”感兴趣。

<?php
    $A = array( 3, 4, 2, 1);
    $B = array( 1=>"one", 2=>"two", 3=>"three", 4=>"four" );
    print_r($A);echo '<br/>';
    print_r($B);echo '<br/>';

    function matchAtoB($sourceA, $sourceB)
    {
        global $B;
        return $B[$sourceA];
    }

    $O = array_map("matchAtoB", $A, $B);
    print_r($O);
?>

因此该函数一次只能接收每个数组的元素(而不是整个数组),它将自动循环/重复自身,直到处理完数组中的所有元素。

干杯,

答案 2 :(得分:0)

您不需要循环,您可以立即访问元素:

$three = $b[$a[0]]; // "three"
$four = $b[$a[1]]; // "four"
$two = $b[$a[2]]; // "two"
$one = $b[$a[3]]; // "one"

您可以将此视为实现相同目标的“懒惰”或“及时”方式,但无需为哈希映射编制索引。

如果你想明确地使用数组,没有额外的查找,你将需要一个循环。

我不确定这是否有名称,但'数据存储区'或'哈希图'与有序键组合的组合并不常见。

答案 3 :(得分:0)

$order = array(3, 4, 2, 1);
$input = array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four');

使用array_map()(PHP 5.3&gt;)

$output = array_map(function($v) use($input) { 
  return $input[$v]; 
}, $order);

但是,这与执行以下操作基本相同:

$output = array();
foreach ($order as $o) {
  $output[] = $input[$o];
}

我不能诚实地看到这样做的简短方法。

答案 4 :(得分:0)

NullUserException在评论中发布了答案:

array_map(function ($v) use ($b) { return $b[$v]; }, $a);