Php 使用array_键搜索包含部分数组的多维数组
如上面的代码所示,我希望能够在多维数组中快速查找数组,但只指定其中两个值 您可以通过计算交集测试哪些数组包含值来过滤数组,然后获取这些键:Php 使用array_键搜索包含部分数组的多维数组,php,arrays,Php,Arrays,如上面的代码所示,我希望能够在多维数组中快速查找数组,但只指定其中两个值 您可以通过计算交集测试哪些数组包含值来过滤数组,然后获取这些键: $testArray = array( array(1,2,"file1.png"), array(1,3,"file2.png"), array(1,4,"file3.png") );
$testArray = array(
array(1,2,"file1.png"),
array(1,3,"file2.png"),
array(1,4,"file3.png")
);
print_r (array_keys($testArray, array(1,3, "file2.png"))); // Works
print_r (array_keys($testArray, array(1,3))); // Does not work.
您可以使用搜索$s
变量对其进行扩展:
$keys = array_keys(array_filter($testArray,
function($v) {
return count(array_intersect([1,3], $v)) == 2;
}));
这将返回包含[1,3]
、[3,1]
甚至[3,“file2.png”,1]
的任何子数组的键,顺序无关
要按顺序检查它们,请执行以下操作:
$s = [1,3];
$keys = array_keys(array_filter($testArray,
function($v) use($s) {
return count(array_intersect($s, $v)) == count($s);
}));
一种方法是使用array\u map将testArray过滤到那些密钥数,然后使用array\u search获取密钥
$s = [1,3];
$keys = array_keys(array_filter($testArray,
function($v) use($s) {
return count(array_intersect_assoc($s, $v)) == count($s);
}));
您的阵列数据
$testArray = array(
array(1,2,"file1.png"),
array(1,3,"file2.png"),
array(1,4,"file3.png")
);
$search = [1,3];
$filtered = array_map(function ($item) use ($search){
return array_slice($item, 0, count($search));
}, $testArray);
$key = array_search($search, $filtered);
if ($key !== false){
print_r($testArray[$key]);
} else {
echo 'not found';
}
指定将搜索条件匹配到数组中的内容
$testArray = [
[1, 2, 'file1.png'],
[1 ,3, 'file2.png'],
[1 ,4, 'file3.png']
];
循环遍历数组数据以查找匹配项,使用该匹配项比较两个数组之间的值和键。将实际找到的键及其值存储到新数组中
$matching = [1, 3];
显示结果
foreach ($testArray as $index => $contents) {
if (array_intersect_assoc($matching, $contents) == $matching) {
$found[$index] = $contents;
}
}
echo';
!空($found)?print_r($found):print_r('notfound');
在数据中循环并切片每个三元组,取前两个项目,并将其与针进行比较。返回给定匹配项的文件
<?php
$data = array(
array(1, 2, "file1.png"),
array(1, 3, "file2.png"),
array(1, 4, "file3.png")
);
$get_file_from_coords = function(array $coords) use ($data) {
foreach($data as $v) {
if (array_slice($v, 0, 2) == $coords) {
return $v[2];
}
}
};
echo $get_file_from_coords([1, 3]);
(注意:如果有多个文件与坐标对关联,则需要调整代码以返回匹配数组。)
在这里,你不一定需要切割或做任何花哨的事情。你可以这样比较:
[$v[0], $v[1]] == $coords
这不是数组键的工作方式,数组键按值搜索键。数组(1,3)的值与$testArray包含的值不同。我不相信有一种不复制或操纵数组值的“快速”方法可以做到这一点。这就是我所怀疑的。我只是想知道是否有一种方法可以潜在地使用一个搜索值,比如(1,3,通配符),这样作为最终结果,您实际上需要关键点,或者如果有,则只需使用true/false?我需要的是查看数组中是否有x,y坐标,这样我就可以找到在该位置用于地图的文件。因此,如果数组中有1,2,那么我需要获取密钥,以便获取值“file1.png”以显示在地图上该位置。我目前正在使用本网站其他地方显示的循环方法,但我想知道是否有一种可能更快的替代方法。对我的答案的评论可以使用
array\u intersect\u assoc
按顺序匹配它们。在这种情况下,[1,3]和[3,1]的搜索值会有相同的结果是的,如果这不是他们想要的,那么他们可以使用其他东西。同样值得注意的是,[3,3]会返回任何带有3的东西是的,但是array\u intersect
只会返回1
3,并且1
的计数也不是==2
我也喜欢这个答案,但我会选择另一个,因为它让我找到我真正需要的东西。这个答案非常有助于扩展我的PHP知识,所以我很感谢你和我的时间。这个答案缺少教育性的解释。(…和大括号以满足现代/专业/psr标准)为什么不使用[]
而不是null
作为默认值。不需要任何计数@米克·麦卡斯被移除。
file2.png
[$v[0], $v[1]] == $coords