【问题标题】:PHP - Return only unique values from multi-arrayPHP - 仅返回来自多数组的唯一值
【发布时间】:2018-04-11 13:49:56
【问题描述】:

我的数组包含以下内容:

Array ( [0] => Events - Central [1] => Central [2] => Finance [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Events - Central [1] => Central [2] => HR [3] => 17 [5] => 11 [8] => 11 )
Array ( [0] => Events - Central [1] => Central [2] => IT [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Events - Central [1] => London [2] => Sales [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Events - Central [1] => London [2] => Marketing [3] => 17 [5] => 11 [8] => 11 )
Array ( [0] => Events - Central [1] => London [2] => HR [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Piloting [1] => London [2] => HR [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Piloting [1] => London [2] => IT [3] => 17 [5] => 11 [8] => 11  )

现在,使用简单的 WHILE 循环可以让我循环遍历数组,我可以轻松地提取我需要的信息,但我很挣扎,因为我需要带回不同的值(而且我无法更改 SQL代码)。

输出将是一个像这样的简单表格,但请注意表格的第 1 级和第 2 级没有重复:

Events - Central          17
    Central               17
        Finance           11
        HR                 1
        IT                 1
    London                28
        Sales             17
        Marketing          2
        HR                 5
Piloting                  37
    London                37
       HR                 30
       IT                  7

简而言之,我正在尝试恢复 distinct 实例 - 如果这有意义吗?

这甚至可以在不解构数组的情况下实现吗?

我很清楚我可能没有很好地说明/框定这个问题。

【问题讨论】:

  • 所以数组位置 0,1 和 2 有“标题”,但数字来自哪里。我看到它们在数组的其余部分“某处”,但我看不出它们背后有任何明确的逻辑。
  • 你能给我一个包含这些值的简单数组吗?
  • Apols - 我看不清楚。它是位置 3、5 和 8 - 请注意,我在表格示例中引用的数字与数组不匹配 - 它们都是出于示例目的。
  • 哪些字段应该是唯一的?
  • 如果您不提供与示例输入匹配的示例输出,我们可能无法提供帮助。

标签: php arrays multidimensional-array while-loop distinct


【解决方案1】:

您可以执行以下操作:(a) 回显您需要的数据,以及 (b) 创建一个数组,其中所述数据以您可以使用的方式模糊排列:

<?php
$superArray = [
    [ "Events - Central", "Central", "Finance",   17, 0, 11, 0, 0, 11, 0 ],
    [ "Events - Central", "Central", "HR",        17, 0, 11, 0, 0, 11, 0 ],
    [ "Events - Central", "Central", "IT",        17, 0, 11, 0, 0, 11, 0 ],
    [ "Events - Central", "London",  "Sales",     17, 0, 11, 0, 0, 11, 0 ], 
    [ "Events - Central", "London",  "Marketing", 17, 0, 11, 0, 0, 11, 0 ],
    [ "Events - Central", "London",  "HR",        17, 0, 11, 0, 0, 11, 0 ],
    [ "Piloting",         "London",  "HR",        17, 0, 11, 0, 0, 11, 0  ],
    [ "Piloting",         "London",  "IT",        17, 0, 11, 0, 0, 11, 0 ]
];



usort($superArray, function ($a,$b) {
    return $a[0] == $b[0] && $a[1]==$b[1]
        ? $a[2]<=>$b[2]
        : (
            $a[0] == $b[0]
            ?$a[1]<=>$b[1]
            :$a[0]<=>$b[0]
        );
});

$lastSeen = [];
$buildArray = [];

foreach ($superArray as $array) {

    if (!isset($lastSeen[0]) || $lastSeen[0] != $array[0]) {
        $lastSeen[0] = $array[0];
        $lastSeen[1] = null;
        echo $array[0]."\t".$array[3].PHP_EOL;
        $buildArray[]= [
            "level" => 0,
            "name" => $array[0],
            "value" => $array[3]
        ];
    }
    if (!isset($lastSeen[1]) || $lastSeen[1] != $array[1]) {
        $lastSeen[1] = $array[1];
        $lastSeen[2] = null;
        echo "\t".$array[1]."\t".$array[5].PHP_EOL;
        $buildArray[]= [
            "level" => 1,
            "name" => $array[1],
            "value" => $array[5]
        ];

    }
    if (!isset($lastSeen[2]) || $lastSeen[2] != $array[2]) {
        $lastSeen[2] = $array[2];
        echo "\t\t".$array[2]."\t".$array[8].PHP_EOL;
        $buildArray[]= [
            "level" => 2,
            "name" => $array[2],
            "value" => $array[8]
        ];

    }

}


print_r($buildArray);

这将打印:

Events - Central    17
    Central 11
        Finance 11
        HR  11
        IT  11
    London  11
        HR  11
        Marketing   11
        Sales   11
Piloting    17
    London  11
        HR  11
        IT  11

数组结构将是:

Array
(
    [0] => Array
        (
            [level] => 0
            [name] => Events - Central
            [value] => 17
        )

    [1] => Array
        (
            [level] => 1
            [name] => Central
            [value] => 11
        )

    [2] => Array
        (
            [level] => 2
            [name] => Finance
            [value] => 11
        )

    [3] => Array
        (
            [level] => 2
            [name] => HR
            [value] => 11
        )

    [4] => Array
        (
            [level] => 2
            [name] => IT
            [value] => 11
        )

    [5] => Array
        (
            [level] => 1
            [name] => London
            [value] => 11
        )

    [6] => Array
        (
            [level] => 2
            [name] => HR
            [value] => 11
        )

    [7] => Array
        (
            [level] => 2
            [name] => Marketing
            [value] => 11
        )

    [8] => Array
        (
            [level] => 2
            [name] => Sales
            [value] => 11
        )

    [9] => Array
        (
            [level] => 0
            [name] => Piloting
            [value] => 17
        )

    [10] => Array
        (
            [level] => 1
            [name] => London
            [value] => 11
        )

    [11] => Array
        (
            [level] => 2
            [name] => HR
            [value] => 11
        )

    [12] => Array
        (
            [level] => 2
            [name] => IT
            [value] => 11
        )

)

这个想法是首先将所有数组放在一个组合数组中,然后根据优先级排序(我认为它们已经排序)。完成此操作后,您可以跟踪每个级别所看到的内容,并在此基础上重新构建一个数组。

请记住,这是非常硬编码的东西,但如果需要,您可能会对其进行概括。

例如:http://sandbox.onlinephpfunctions.com/code/bf92828a5561d59d503e5765cc6b566a5acc0532

【讨论】:

  • 非常有帮助 - 谢谢。我认为,在无法更改查询的情况下,我正在研究解构数组和/硬编码,就像你说的那样。但是,以上确实有帮助。感谢和赞赏。
【解决方案2】:

apokryfos 的回答略有不同,但概念相似。这个想法是利用 PHP 中数组键的重复数据删除能力来构建分层数组:

$data = [];
$data[] = [0 => 'Events - Central', 1 => 'Central', 2 => 'Finance', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'Central', 2 => 'HR', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'Central', 2 => 'IT', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'London', 2 => 'Sales', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'London', 2 => 'Marketing', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'London', 2 => 'HR', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Piloting', 1 => 'London', 2 => 'HR', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Piloting', 1 => 'London', 2 => 'IT', 3 => 17, 5 => 11, 8 => 11];

$tree_root = [];

// map the keys in the $data array to each other
$caption_to_value_mapping = [
    0 => 3,
    1 => 5,
    2 => 8
];

foreach ($data as $datum) {
    $sub_tree = &$tree_root;
    foreach ($caption_to_value_mapping as $level_index => $value) {
        $caption = $datum[$level_index];
        if (!isset($sub_tree[$caption])) {
            $sub_tree[$caption] = ['next_level' => []];
        }
        $sub_tree[$caption]['caption'] = $caption;
        $sub_tree[$caption]['value'] = $datum[$value];
        $sub_tree = &$sub_tree[$caption]['next_level'];
    }
}

var_dump($tree_root);

然后您可以在递归函数中使用 $tree_root 来构建数据的显示。

请注意,这是通用的,只要保持 $caption_to_value_mapping 即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多