0

注:1つのステートメントで、これを機能的に実行することが私の望みであることを明確にする必要があります。私はループでこれを簡単に行うことができますが、それは私が興味を持っていることではありません。

2つの配列があります。インデックスの数値配列Aと、配列Aの要素によってインデックスが付けられたオブジェクトOの連想配列Bです。

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

ループは必要ありません。すぐに要素にアクセスできます。

$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 に答える
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 に答える