在PHP中选择基于另一个数组的索引

在PHP中选择基于另一个数组的索引,php,arrays,Php,Arrays,我有两个这样的数组 Array ( [0] => 1 [1] => 3 [2] => 4 [3] => 5 ) Array ( [0] => Array ( [1] => Test1 [2] => Location1 [3] => Email1 [4] => Name1

我有两个这样的数组

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

只需使用如下的
array\u 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);
$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);
使用一个循环,您可以这样做:

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

)
您可以尝试以下方法:

。感谢@Michael Irigoyen提供的阵列…

使用一个循环:

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

您可能还会发现关于数组翻转的说明很有用

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

键可以是整数或字符串。该值可以是任何类型

此外,还会发生以下关键点强制转换:

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

array_flip()以翻转顺序返回一个数组,即trans-be-value中的键和trans-be-key中的值

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

如果某个值多次出现,则将使用最新的键作为其值,其他所有键都将丢失


没有环!我认为这是不可能做到的:(为什么你不想使用多个循环?使用两个循环是很常见的。我想知道是否有php内置函数或逻辑,这样我就可以实现它。使用两个循环并不是一件坏事。它不会使它比一个循环和一些黑客代码慢。从正面来看,代码可读性会更好。
array\u map
在救援中。a人们经常忘记的强大工具。
array\u intersect\u key
使用了键值,但没有达到OP的预期效果。是的,我已经测试过,它不符合我的要求,因为你可以看到它总是选择前4列。是的,我也忽略了这一点。我已经修改了我的答案来解决这个问题。谢谢@MichaelIrig谢谢你的帮助。它没有选择所需的结果。请测试it@raheelshan你翻转了你的按键数组了吗?@raheel shan它确实有效,请参见我的编辑/代码板上的示例。我在数组映射中没有看到$array?这是一种非常低效的方法。