根据PHP中的另一个数组选择索引

时间:2013-02-25 20:38:53

标签: php arrays

我有两个像这样的数组

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索引值。如果没有两个循环我怎么能这样做。我知道我将不得不使用一个,但我不想使用两个循环

需要输出

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
        )
)

5 个答案:

答案 0 :(得分:4)

使用一个循环,array_fliparray_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
        )

)

答案 1 :(得分: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);
}

Working example on codepad。感谢@Michael Irigoyen为阵列......

答案 2 :(得分: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);

答案 3 :(得分:0)

使用一个循环:

<?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);

答案 4 :(得分:0)

您可能还会发现有关array_flip的说明很有用。

确保$ array1具有可在翻转时作为数组键接受的值。

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

  

密钥可以是整数或字符串。值可以是任何类型。

     

此外还会发生以下关键演员:

     

包含有效整数的字符串将强制转换为整数类型。例如。键“8”实际上将存储在8下。另一方面,“08”将不会被转换,因为它不是有效的十进制整数。   浮点数也会转换为整数,这意味着小数部分将被截断。例如。密钥8.7实际上将存储在8下。   Bool也被转换为整数,即键值true实际上将存储在1下,键值为0。   Null将被强制转换为空字符串,即密钥null实际上将存储在“”下。   数组和对象不能用作键。这样做会导致警告:非法偏移类型。   如果数组声明中的多个元素使用相同的键,则只会使用最后一个键,因为所有其他元素都会被覆盖。

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

  

array_flip()以翻转顺序返回一个数组,即来自trans的键成为值,而来自trans的值成为键。

     

请注意,trans的值必须是有效键,即它们必须是整数或字符串。如果值的类型错误,将发出警告,并且相关的键/值对将不包含在结果中。

     

如果值有多次出现,则最新的密钥将用作其值,而其他所有密钥将丢失。