0

注意:我应该清楚我的愿望是在一个声明中在功能上做到这一点。我可以通过循环轻松地做到这一点,但这不是我感兴趣的。

我有两个数组:一个索引数字数组 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" ]

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

4

5 回答 5

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);
于 2012-10-13T23:06:56.723 回答
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);
?>

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

干杯,

于 2012-10-13T23:20:44.707 回答
0
$order = array(3, 4, 2, 1);
$input = array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four');

使用array_map() (PHP 5.3 >)

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

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

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

老实说,我看不到更短的方法。

于 2012-10-13T23:50:46.657 回答
0

NullUserException 在评论中发布了答案:

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

于 2012-10-14T00:38:06.250 回答
0

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

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

您可以将其视为实现相同目标的“懒惰”或“及时”方式,但没有索引哈希映射的提前成本。

如果您需要明确的数组,而不需要额外的查找,您将需要一个循环。

我不确定这是否有名称,但“数据存储”或“哈希映射”与有序键数组的组合并不少见。

于 2012-10-13T23:09:06.877 回答