【问题标题】:sort multidimensional array on the basis of a field in php根据php中的字段对多维数组进行排序
【发布时间】:2020-07-08 21:23:14
【问题描述】:

我有如下图所示的多维数组,我想根据php中的[name]字段进行排序。

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD.
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration.
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Carry.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Responsibility.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )   
                )

        )

)

这就是我想要实现的目标:

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD.
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Carry.
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Responsibility.
                                )
                        )   
                )

        )

)

这是我尝试过的,但我认为还有更多工作要做。

function cmp($a, $b)
{
    if ($a["name"] == $b["name"]) {
        return 0;
    }
    return ($a["name"] < $b["name"]) ? -1 : 1;
}

usort($response,"cmp");

问题陈述:

我想知道我需要在上面的 php 代码中进行哪些更改,以便它根据 name 字段对数组进行排序。上面我的 php 代码没有对任何东西进行排序。它只是按原样打印输入。

【问题讨论】:

  • 如果 $response 是你的数组,它的元素没有'name'键,它们的键是'comunity...'、'area'等
  • 也许您的意思是foreach($response as $town){ usort($town['areas'] , 'cmp' ); } 或类似的东西?您的 cmp 函数还应该比较 $a['name'][0]==$b['name'][0]...

标签: php arrays sorting multidimensional-array


【解决方案1】:

根据您的示例,您实际上是在尝试对 areas 子数组进行排序,而不是对整个父数组进行排序。因此,您需要依次遍历每个子数组并分别对它们进行排序。

$array = [
    'chicago' => [
        'community_name' => 'Chicago, IL',
        'areas' => [
            [
                'name' => ['HELLO WORLD.']
            ],
            [
                'name' => ['Hello'],
            ],
            [
                'name' => ['Administration.'],
            ],
        ],
    ],
    'chicago-and-surrounding-areas' => [
        'community_name' => 'Chicago (and surrounding areas), IL',
        'areas' => [
            [
                'name' => ['Carry.']
            ],
            [
                'name' => ['Bacteria.'],
            ],
        ],
    ],
    'cambridge-chicago' => [
        'community_name' => 'Cambridge (Chicago), IL',
        'areas' => [
            [
                'name' => ['Responsibility.']
            ],
            [
                'name' => ['Bacteria'],
            ],
        ],
    ],
];

foreach ($array as &$locality) {
    usort($locality['areas'], function ($a, $b) {
        return $a['name'][0] <=> $b['name'][0];
    });
}

var_dump($array);

Working example

【讨论】:

  • 我查看了代码,它看起来不错。我想知道为什么HELLO WORLD 会在Hello 之前出现。想法?
  • 因为H 的值被认为低于hvar_dump('H' &lt; 'h'); // true.
  • 我还有一个问题。我稍微修改了fiddle。在其中,我添加了一些带重音的字符词。我想知道我需要对小提琴中的代码进行哪些更改,以便在排序时忽略重音字符。在 o/p 中,Aṕple 应该在 Avocados 之前。
  • 您可以使用iconv() 函数来转换字符编码。看到这个example
  • 这完全取决于您使用的字符。 UTF-8(它是什么)适用于所有字符。您现在正在使用拉丁字符的子集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
相关资源
最近更新 更多