如何在重复某些数据的php数组中对数据进行排序和分组?

时间:2015-12-07 23:05:43

标签: php arrays sorting

我有一个php数组,其中包含有时相同的值(在我的例子中是电影1和电影2),我想对结果进行排序,以便只保留一次电影1或电影2。

PHP数组:$actors

Array
(
    [0] => Array
        (
            [0] => film 1
            [1] => actor A
        )

    [1] => Array
        (
            [0] => film 1
            [1] => actor B
        )

    [2] => Array
        (
            [0] => film 2
            [1] => actor C
        )

    [3] => Array
        (
            [0] => film 2
            [1] => actor D
        )
)

我可以在foreach循环中输出数据:

$i = 0;
foreach ($films as $film):

    echo $film[$i][0].'<br />';
    echo $film[$i][1];

    $i ++;

endforeach;

我得到这样的结果:

film1
actor A

film1
actor B

film2
actor C

film2
actor D

但我希望得到这样的结果:

film 1
actor A
actor B

film 2
actor C
actor E

我做了什么:

我用电影制作了一个阵列:$films

Array
(
    [0] => stdClass Object
        (
            [name] => film1
        )

    [1] => stdClass Object
        (
            [name] => film2
        )

我检查$films数组中是否存在actors数组中的数据:

$i = 0;
foreach ($films as $film):

    foreach ($actors as $actor):

    if ($film->name == $actor[$i][0]) {

        echo $actor[$i][1].'<br />';
    }

    endforeach;

    $i ++;

endforeach;

所以这段代码对我有用,但有更好的解决方案吗?在我的解决方案中,我在foreach循环中有一个foreach循环,它可能消耗大量的资源。

1 个答案:

答案 0 :(得分:1)

对于你想要做的事情,你可以做很多事情来避免循环,但是你可以稍微构建你的数组以使它做你想做的事情。您需要创建一个$films数组,并且每个$actors数组都与该电影相关联,而不是拥有两个单独的$films$actors数组:

$films = []; // PHP 5.4 style array shortcut. Creates a new empty array (same as array())

foreach($actors as $actor)
{
    $filmName = $actor[0];
    $actorName = $actor[1];

    // If this film isn't in the array yet, let's create it
    if(!isset($films[$filmName])) 
    {
        $films[$filmName] = []; 
    }

    // Add the actor to the film array
    array_push($films[$filmName], $actorName);
}

$actors数组上运行上述代码会生成以下$films数组

Array
(
    [film 1] => Array
        (
            [0] => actor A
            [1] => actor B
        )

    [film 2] => Array
        (
            [0] => actor C
            [1] => actor D
        )

)

要获得对电影中演员列表的访问权限,您可以使用$films["film 1"],它会为您提供一系列演员。