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