Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP多维数组与一维数组相交_Php_Arrays_Multidimensional Array - Fatal编程技术网

PHP多维数组与一维数组相交

PHP多维数组与一维数组相交,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,需要从数组A中删除数组B上不存在键“service_code”值的数组。在本例中,数组B上只存在“SAF”。您尝试了多种数组_intersect函数,但没有成功。我相信一定有一种我不知道的方法来完成这个任务,而不是做一个循环。如有必要,我还可以通过移除数组_键来反转数组B 阵列A Array ( [1] => Array ( [id] => 2 [service_name] => Carpet Cleani

需要从数组A中删除数组B上不存在键“service_code”值的数组。在本例中,数组B上只存在“SAF”。您尝试了多种数组_intersect函数,但没有成功。我相信一定有一种我不知道的方法来完成这个任务,而不是做一个循环。如有必要,我还可以通过移除数组_键来反转数组B

阵列A

Array
(
    [1] => Array
        (
            [id] => 2
            [service_name] => Carpet Cleaning
            [type] => 
            [category_name] => Household
            [service_code] => SAF
            [category_code] => AA
        )

    [2] => Array
        (
            [id] => 3
            [service_name] => Floor Cleaning
            [type] => 
            [category_name] => Household
            [service_code] => MHSAF
            [category_code] => AA
        )

    [3] => Array
        (
            [id] => 4
            [service_name] => Lawn Service
            [type] => 
            [category_name] => Landscape
            [service_code] => GHF
            [category_code] => AA
        )
)
阵列B

Array
(
    [0] => SAF
    [1] => SA
    [2] => MM
    [3] => METH
    [4] => OTPA
    [5] => OTP
    [6] => CBT
    [7] => SACA
    [8] => TRC
    [9] => REBT
)
预期结果

Array
(
    [1] => Array
        (
            [id] => 2
            [service_name] => Carpet Cleaning
            [type] => 
            [category_name] => Household
            [service_code] => SAF
            [category_code] => AA
        )
)

您的解决方案是
array\u filter

$filtered = array_filter(
    $array1,
    function($v) use ($array2) {
        return in_array($v['service_code'], $array2);
    }
);

您的解决方案是
array\u filter

$filtered = array_filter(
    $array1,
    function($v) use ($array2) {
        return in_array($v['service_code'], $array2);
    }
);

在一天结束时,您将执行循环,无论这些数据结构如何,即使“循环”隐藏在函数调用中,如
array\u filter()

我的第一个建议是,如果可能的话,更改数组B,这样就不需要迭代它来查看数组中是否存在值。数据结构,如:

[
  'SAF' => 1,
  'SA' => 1,
   ...
]
通过在数组上执行
array\u flip()
,可以轻松实现这样的数据结构

键包含要查找的值的结构将允许您执行O(1)查找,而不是O(n),以检查数组A中的服务代码

然后,您的代码可能会如下所示:

$result = array_filter($array_a, function($item, $k) use ($array_b) {
    return array_key_exists($item['service_code'], $array_b);   
});
如果无法按所述更改数组b,则需要在
array\u filter
操作中迭代数组b(这是调用
in\u array()
函数时发生的情况):

$result = array_filter($array_a, function($item, $k) use ($array_b) {
    return in_array($item['service_code'], $array_b);  
});
第一个解决方案的运行时复杂性为O(n),其中n是数组a中的元素数

第二个解决方案的运行时复杂性为O(n*m),其中m是数组B的元素数(n仍然是数组a中的元素数)

由于第二个解决方案的性能很差,因此可以使用
array\u flip()


当你用一次O(m)点击来迭代和翻转数组B时,操作复杂性将提高到O(m+n)。这仍然比
in_Array()
解决方案有很大的改进。

在一天结束时,你将执行循环,无论这些数据结构如何,即使“循环”隐藏在函数调用中,如
array\u filter()

我的第一个建议是,如果可能的话,更改数组B,这样就不需要迭代它来查看数组中是否存在值。数据结构,如:

[
  'SAF' => 1,
  'SA' => 1,
   ...
]
通过在数组上执行
array\u flip()
,可以轻松实现这样的数据结构

键包含要查找的值的结构将允许您执行O(1)查找,而不是O(n),以检查数组A中的服务代码

然后,您的代码可能会如下所示:

$result = array_filter($array_a, function($item, $k) use ($array_b) {
    return array_key_exists($item['service_code'], $array_b);   
});
如果无法按所述更改数组b,则需要在
array\u filter
操作中迭代数组b(这是调用
in\u array()
函数时发生的情况):

$result = array_filter($array_a, function($item, $k) use ($array_b) {
    return in_array($item['service_code'], $array_b);  
});
第一个解决方案的运行时复杂性为O(n),其中n是数组a中的元素数

第二个解决方案的运行时复杂性为O(n*m),其中m是数组B的元素数(n仍然是数组a中的元素数)

由于第二个解决方案的性能很差,因此可以使用
array\u flip()


当你用一次O(m)点击来迭代和翻转数组B时,操作复杂度将提高到O(m+n)。这仍然比
in_Array()
解决方案有很大的改进。

因为
服务代码
在数组a中是唯一的,你可以使用
数组列
使用
服务代码
来重新索引数组a

$array_a = array_column($array_a, null, 'service_code');
然后翻转数组B,使其值成为键

$array_b = array_flip($array_b);
然后您可以使用
array\u intersect\u key
获得结果

$result = array_intersect_key($array_a, $array_b);
或者,如果您愿意,也可以使用“一条龙”语句:

$result = array_intersect_key(
    array_column($array_a, null, 'service_code'), array_flip($array_b));

因为
service\u code
在数组A中是唯一的,所以可以使用
array\u column
使用
service\u code
重新索引数组A

$array_a = array_column($array_a, null, 'service_code');
然后翻转数组B,使其值成为键

$array_b = array_flip($array_b);
然后您可以使用
array\u intersect\u key
获得结果

$result = array_intersect_key($array_a, $array_b);
或者,如果您愿意,也可以使用“一条龙”语句:

$result = array_intersect_key(
    array_column($array_a, null, 'service_code'), array_flip($array_b));

service\u code
在数组A中是唯一的,还是多个条目可以具有相同的一个?是的,service\u code在数组A中是唯一的AIs
service\u code
在数组A中是唯一的,还是多个条目可以具有相同的一个?是的,service\u code在数组A中是唯一的解决方案,但操作复杂度超过了需要。此解决方案有效,但是操作复杂度比必要的要高。这不会生成所需的输出,其中包含成功相交的整个内部数组元素。抱歉,我误读了代码。这个解决方案会起作用,但从复杂性的角度来看不是很理想。每个内部函数调用将是O(n),外部函数调用将是O(n+m)ibelievet,它不会生成所需的输出,其中包含成功相交的整个内部数组元素。抱歉,我误读了代码。这个解决方案会起作用,但从复杂性的角度来看不是很理想。每个内部函数调用将是O(n),外部函数调用将是O(n+m)ibelieve使用第一个解决方案,得到错误@mike brant'缺少{closure}()'nevermind@mike brant的参数2,我现在从函数中删除第二个参数。函数($item)使用第一个解决方案,得到错误@mike brant'缺少{closure}()'nevermind@mike brant的参数2,我从函数中删除了第二个参数现在可以工作了。功能($项)使用