0

このような2つの配列があります

Array
(
    [0] => 1
    [1] => 3
    [2] => 4
    [3] => 5
)

Array
(
    [0] => Array
        (
            [1] => Test1
            [2] => Location1
            [3] => Email1
            [4] => Name1
            [5] => Address1
            [6] => Age1
            [7] => Gender1
            [8] => Phone1
            [9] => Website1
            [10] => Cell1
        )

    [1] => Array
        (
            [1] => Test2
            [2] => Location2
            [3] => Email2
            [4] => Name2
            [5] => Address2
            [6] => Age2
            [7] => Gender2
            [8] => Phone2
            [9] => Website2
            [10] => Cell2
        )

    [2] => Array
        (
            [1] => Test3
            [2] => Location3
            [3] => Email3
            [4] => Name3
            [5] => Address3
            [6] => Age3
            [7] => Gender3
            [8] => Phone3
            [9] => Website3
            [10] => Cell3
        )
)

ここで、各秒配列から 1、3、4、および 5 のインデックス値を選択する必要があります。2 つのループなしでこれを行うにはどうすればよいですか。1つを使用する必要があることはわかっていますが、2つのループを使用したくありません

必要な出力

Array
(
    [0] => Array
        (
            [1] => Test1
            [3] => Email1
            [4] => Name1
            [5] => Address1

        )

    [1] => Array
        (
            [1] => Test2
            [3] => Email2
            [4] => Name2
            [5] => Address2
        )

    [2] => Array
        (
            [1] => Test3
            [3] => Email3
            [4] => Name3
            [5] => Address3
        )
)
4

5 に答える 5

4

1 つのループ 、array_flip、およびを使用するとarray_intersect_key、次のように実行できます。

$array_one = array(1, 3, 4, 5);

$array_two = array(
    array(1 => 'Test1', 'Location1', 'Email1', 'Name1', 'Address1', 'Age1', 'Gender1', 'Phone1', 'Website1', 'Cell1'),
    array(1 => 'Test2', 'Location2', 'Email2', 'Name2', 'Address2', 'Age2', 'Gender2', 'Phone2', 'Website2', 'Cell2'),
    array(1 => 'Test3', 'Location3', 'Email3', 'Name3', 'Address3', 'Age3', 'Gender3', 'Phone3', 'Website3', 'Cell3')
); 

$array_one_flip = array_flip($array_one);
foreach($array_two as $k => $v) {
    $result[] = array_intersect_key($v, $array_one_flip);
}

print_r($result);

結果は次のようになります。

Array
(
    [0] => Array
        (
            [1] => Test1
            [3] => Email1
            [4] => Name1
            [5] => Address1
        )

    [1] => Array
        (
            [1] => Test2
            [3] => Email2
            [4] => Name2
            [5] => Address2
        )

    [2] => Array
        (
            [1] => Test3
            [3] => Email3
            [4] => Name3
            [5] => Address3
        )

)
于 2013-02-25T20:55:28.663 に答える
2

あなたはそれを試すことができますarray_intersect_key

$keys = array_flip($keys_array);    // flip the keys array for matching with array_intersect_key
$result = array();
foreach ($content_array as $arr)
{
  $result[] = array_intersect_key($arr, $keys);
}

codepad での作業例。配列をありがとう@Michael Irigoyen...

于 2013-02-25T20:55:45.470 に答える
1

array_map次のような関数を使用するだけです:

$keys_to_keep = array(1, 3, 4, 5);
$key_diff_array = array_fill_keys($keys_to_keep, 'not used');

$array; // your main array you want to filter assume value has been set elsewhere

$filtered_array = array_map(function ($value) use $key_diff_array {
    return array_intersect_key($value, $key_diff_array);
}, $array);
于 2013-02-25T20:52:03.417 に答える
0

array_flipに関するこのメモも役立つ場合があります。

$ array1に、反転したときに配列キーとして受け入れることができる値があることを確認してください。

http://php.net/manual/en/language.types.array.php

キーは整数または文字列のいずれかです。値は任意のタイプにすることができます。

さらに、次のキーキャストが発生します。

有効な整数を含む文字列は、整数型にキャストされます。たとえば、キー「8」は実際には8の下に格納されます。一方、「08」は有効な10進整数ではないため、キャストされません。フロートも整数にキャストされます。これは、小数部分が切り捨てられることを意味します。たとえば、キー8.7は実際には8の下に格納されます。ブールも整数にキャストされます。つまり、キーtrueは実際には1の下に格納され、キーfalseは0の下に格納されます。nullは空の文字列にキャストされます。つまり、キーnullは実際には「」の下に保存されます。配列とオブジェクトをキーとして使用することはできません。これを行うと、警告が表示されます:無効なオフセットタイプ。配列宣言の複数の要素が同じキーを使用する場合、他のすべての要素が上書きされるため、最後の要素のみが使用されます。

http://www.php.net/manual/en/function.array-flip.php

array_flip()は、配列を反転順に返します。つまり、transからのキーが値になり、transからの値がキーになります。

transの値は有効なキーである必要があることに注意してください。つまり、整数または文字列である必要があります。値のタイプが間違っている場合は警告が発行され、問題のキーと値のペアは結果に含まれません。

値に複数のオカレンスがある場合、最新のキーがその値として使用され、他のすべてのキーは失われます。

于 2013-02-25T21:48:20.387 に答える
0

1 つのループを使用:

<?php
 $selection = array(1, 3, 4, 5);
 for($i = 0; $i < count($array); $i++){

 reset($selection);
 $first = current($selection);
 $newarray[$i][$first] = $array[$i][$first];

 $next = next($selection);
 $newarray[$i][$next] = $array[$i][$next];

 $next = next($selection);
 $newarray[$i][$next] = $array[$i][$next];

 $next = next($selection);
 $newarray[$i][$next] = $array[$i][$next];
}
echo '<pre>';
print_r($newarray);
于 2013-02-25T21:07:06.720 に答える