过滤PHP数组以进行多选,其中子数组项相同

时间:2013-11-20 14:27:18

标签: php multidimensional-array filter multi-select

第一次海报,长期访客。

我已尝试在SO上找到可以帮助我的东西,但到目前为止,我一直没有成功。如果有人知道这个问题的重复我提前道歉,无法找到它。

无论如何,我想知道我的问题是否有最佳实践或最佳解决方案。并不是说我不能编写一个正常运行的代码,我只是希望不要一次重写轮子,希望有一个优雅的解决方案。

考虑以下数组:

Array
(
    [0] => Array
        (
            [filename] => 'test1.jpg'
            [comment] => 'This is a test'
            [status] => 2
            [author] => 'John Smith'
            [uniquekey1] => 3
        )

    [1] => Array
        (
            [filename] => 'test2.jpg'
            [comment] => 'This is a test'
            [status] => 2
            [author] => 'Unknown'
            [uniquekey2] => 3
        )

    [2] => Array
        (
            [filename] => 'test3.jpg'
            [comment] => 'This is a test'
            [status] => 2
            [author] => 'Unknown'
            [uniquekey3] => 3
        )
)

在处理完之后,我希望返回的数组包含上面数组数组中的键,但只包含所有子数组中相同键的键和值。实际上,上面会生成一个如下所示的数组:

Array
(
    [comment] => 'This is a test'
    [status] => 2
)

清楚可见,只返回所有三个(在本例中)数组项中相同的键:值对。

一个很好的使用示例是在iTunes中编辑多个项目,其中相等的值显示在编辑字段中,其余项目显示幻影的“多个值”文本。我的目标是类似的东西。

感谢您提供的所有帮助和指示。

编辑:此处也添加了解决方案。由于接受的解决方案错过了'uniqueKey不相同,并且array_intersect()在值匹配时返回了这些,这是不需要的行为,因此有一点混乱。解决方案是使用array_intersect_assoc()而不是它。

$a = array(
    array(
        'filename' => 'test1.jpg',
        'comment' => 'This is a test',
        'status' => 2,
        'author' => 'John Smith',
        'uniquekey1' => 3
    ),
    array(
        'filename' => 'test2.jpg',
        'comment' => 'This is a test',
        'status' => 2,
        'author' => 'Unknown',
        'uniquekey2' => 3
    ),
    array(
        'filename' => 'test3.jpg',
        'comment' => 'This is a test',
        'status' => 2,
        'author' => 'Unknown',
        'uniquekey3' => 3
    ),
);

$b = call_user_func_array('array_intersect_assoc',$a);

...它会返回“评论”和“状态”字段,而不是其他任何内容。

1 个答案:

答案 0 :(得分:0)

Array_intersect to rescue:

$array = array();
$array[] = array('filename' => 'test1.jpg', 'comment' => 'This is a test', 'uniqueKey' => 3);
$array[] = array('filename' => 'test2.jpg', 'comment' => 'This is a test', 'uniqueKey' => 3);
$array[] = array('filename' => 'test3.jpg', 'comment' => 'This is a test', 'uniqueKey' => 3);

$intersection = call_user_func_array('array_intersect', $array);
然后

$ intersection:

Array
(
    [comment] => This is a test
    [uniqueKey] => 3
)