PHP数组:如何通过传递多个值来查找数组中的所有键?

时间:2019-03-18 15:17:16

标签: php arrays

是否存在通过将另一个数组作为值传递来获取输入数组的所有键的简便方法?

$haystack = array (
  11 => 'Parenting',
  48 => 'How',
  50 => 'Parenting',
  54 => 'parenting',
  57 => 'parenting',
  58 => 'style',
  59 => 'that',
  60 => 'offer',
  61 => 'kids',
  62 => 'greater',
  63 => 'freedom',
);
$needle = ['Parenting', 'offer', 'freedom'];

所需的输出:

$output = array (
      11 => 'Parenting',
      50 => 'Parenting',
      54 => 'parenting',
      57 => 'parenting',
      60 => 'offer',
      63 => 'freedom'
);

我尝试了array_keys,如PHP.net所述,但它返回了一个空数组。

$output= array_keys($haystack, $needle);

4 个答案:

答案 0 :(得分:4)

我相信array_intersect是您所需要的。

  

array_intersect()返回一个数组,其中包含所有自变量中存在的所有array1值。请注意,密钥被保留。

请注意,比较区分大小写。

因此您可以将数组转换为小写,然后对它们进行array_intersect

$haystack = [
    11 => 'Parenting',
    48 => 'How',
    50 => 'Parenting',
    54 => 'parenting',
    57 => 'parenting',
    58 => 'style',
    59 => 'that',
    60 => 'offers',
    61 => 'kids',
    62 => 'greater',
    63 => 'freedom',
];

$needle = ['Parenting', 'offer', 'freedom'];

$result = array_intersect(array_map('strtolower', $haystack), array_map('strtolower', $needle));

答案 1 :(得分:1)

如果您遇到区分大小写的问题,则可以使用preg_grep并内爆。

我将针爆破并用“或”将其分开,并使用regex选项以区分大小写。

var_dump(preg_grep("/" . implode("|", $needle) . "/i", $haystack));

如果针中包含“ regex”字符,则必须使用preg_quote,但是由于|是正则表达式字符,因此preg_quote会“撤消”它,因此我必须使用str_replace进行修复。

var_dump(preg_grep("/" . str_replace("\|", "|", preg_quote(implode("|", $needle))) . "/i", $haystack));

答案 2 :(得分:0)

您可以过滤数组(array_filter):

$output = array_filter($haystack, function ($v) use ($needle) {
    return in_array($v, $needle);
});

答案 3 :(得分:0)

我只是使用一个每个人都会理解的简单函数。对我来说,它既简单又优雅。

function getFragArray($arrayValues, $arrayKey) {
    $resu = [];
    foreach ($arrayValues as $key=>$value) {
        if(in_array($value,$arrayKey)) {
            $resu[$key] = $value;
        }
    }

    return $resu;
}