如何在数组中只保留特定的数组键/值?

新手上路,请多包涵

我有一个多维数组,我正在通过它搜索特定值。如果找到这些值,我需要提取具有这些值的索引(创建新数组)并删除所有其他值。

array_intersect 在 php 5.3 上运行良好,现在在 5.4 上它抱怨 Notice: Array to string conversion。

我发现 array_intersect 在 5.4 上存在多维数组问题。 https://bugs.php.net/bug.php?id=60198

这是我正在搜索的 $options 数组

Array (

    [index1] => html
    [index2] => html
    [index3] => slide
    [index4] => tab
    [index5] => Array
        (
            [0] => 123
        )

)

适用于 php 5.3.x 的代码

$lookfor   = array('slide', 'tab');
$found     = array_intersect($options, $lookfor);

print_r($found);

Array
(
    [index3] => slide
    [index4] => tab
)

但在 5.4.x 中,这会引发上述错误。

请问没有循环的另一种方法是什么。并且不抑制错误。

谢谢!

原文由 Benn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

array_intersect() 不是递归的。该函数假定数组只有一层深,并期望所有数组元素都是标量。当它找到一个非标量值,即一个子数组时,它会抛出一个 Notice。

array_intersect() 的文档 中含糊地提到了这一点:

注意:两个元素被认为是相等的当且仅当:(string) \(elem1 === (string) \)elem2。换句话说:当字符串表示相同时。

我能想到的一种解决方案是使用 array_filter()

 $lookfor = array('html', 'slide');
$found   = array_filter($options, function($item) use ($lookfor) {
    return in_array($item, $lookfor);
});

注意: 这仍然执行循环,并不比简单的 foreach 好多少。事实上,如果数组很大,它可能比 foreach 慢。我不知道你为什么要避免循环——我个人认为如果你只使用循环会更干净。

演示

我能想到的另一个解决方案是在使用之前删除子数组 array_intersect()

 <?php

$options = array(
    'index1' => 'html',
    'index2' => 'html',
    'index3' => 'slide',
    'index4' => 'tab',
    'index5' => array(123),
);

$lookfor = array('html', 'slide');
$scalars = array_filter($options,function ($item) { return !is_array($item); });
$found = array_intersect ($scalars, $lookfor);

print_r($found);

演示

原文由 Amal Murali 发布,翻译遵循 CC BY-SA 3.0 许可协议

$array = [
    'a' => 4,
    's' => 5,
    'd' => 6,
];
$onlyKeys = ['s','d'];

$filteredArray = array_filter($array, function($v) use ($onlyKeys) {
    return in_array($v, $onlyKeys);
}, ARRAY_FILTER_USE_KEY);

prinr_r($filteredArray); //  ['s' => 5, 'd' => 6]

要按值过滤,请从参数列表中删除 ARRAY_FILTER_USE_KEY。

原文由 Turako 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏