在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?这是一种非常低效的方法。