【问题标题】:Remove duplicates in a slice of arrays, preserving recurring values in all other parts [PHP]删除数组切片中的重复项,保留所有其他部分中的重复值 [PHP]
【发布时间】:2017-12-28 05:17:25
【问题描述】:

我有这种数组:

$array[] = "BRAND A|PERIOD 1|RANGE 1";
$array[] = "BRAND A|PERIOD 1|RANGE 2";
$array[] = "BRAND A|PERIOD 1|RANGE 3";
$array[] = "BRAND A|PERIOD 2|RANGE 1";
$array[] = "BRAND A|PERIOD 2|RANGE 2";
$array[] = "BRAND A|PERIOD 2|RANGE 3";
$array[] = "BRAND A|PERIOD 3|RANGE 1";
$array[] = "BRAND A|PERIOD 3|RANGE 2";
$array[] = "BRAND A|PERIOD 3|RANGE 3";
$array[] = "BRAND B|PERIOD 1|RANGE 1";
$array[] = "BRAND B|PERIOD 1|RANGE 2";
$array[] = "BRAND B|PERIOD 1|RANGE 3";

我想得到以下结果:

BRAND A: [PERIOD 1] [PERIOD 2] [PERIOD 3]
BRAND B: [PERIOD 1] 

我尝试使用 for 循环,其中列出并分解所有值,然后 array_unique 删除 $brand 和 $period 数组值中的重复项,最后两个 foreach 嵌套循环......但我无法得到更好的结果比这个:

BRAND A: [PERIOD 1] [PERIOD 2] [PERIOD 3]
BRAND B: [PERIOD 1] [PERIOD 2] [PERIOD 3] 

“品牌 B”数组仅包含一个唯一值:周期 1,但脚本会打印“品牌 A”数组中的所有唯一值。

这是我的代码:

for($i = 0; $array[$i]; $i++):
list($brand, $period, $range) = explode("|", $array[$i]);

$array_brand[] = $brand;
$unique_brand = array_unique($array_brand);
$array_period[] = $period;
$unique_period = array_unique($array_period);

endfor;

foreach($unique_brand as $value_brand):
        echo $value_brand . ": ";

        foreach($unique_period as $value_period):
                echo "[" . $value_period . "] ";
        endforeach;

        echo "<br />";
 endforeach;

非常欢迎任何获得所需结果的建议。 提前致谢。

【问题讨论】:

  • 我不太明白你想要如何形成结果背后的逻辑?
  • @JimWright 我假设他想显示基于品牌的时期,但只显示一次以确保没有重复。
  • 我已经实现的结果生成空值 => 空链接 => 所以打开没有产品的空页面。我希望如果特定产品生命周期中不存在某个时期(如品牌 B 中的情况),则不应显示它:)

标签: php array-unique


【解决方案1】:

我没有测试过这段代码,但我认为它可以满足你的需求。

$array[] = "BRAND A|PERIOD 1|RANGE 1";
$array[] = "BRAND A|PERIOD 1|RANGE 2";
$array[] = "BRAND A|PERIOD 1|RANGE 3";
$array[] = "BRAND A|PERIOD 2|RANGE 1";
$array[] = "BRAND A|PERIOD 2|RANGE 2";
$array[] = "BRAND A|PERIOD 2|RANGE 3";
$array[] = "BRAND A|PERIOD 3|RANGE 1";
$array[] = "BRAND A|PERIOD 3|RANGE 2";
$array[] = "BRAND A|PERIOD 3|RANGE 3";
$array[] = "BRAND B|PERIOD 1|RANGE 1";
$array[] = "BRAND B|PERIOD 1|RANGE 2";
$array[] = "BRAND B|PERIOD 1|RANGE 3";

$res = [];
foreach ($array as $str) {
    $items = explode('|', $str);
    if (! array_key_exists($items[0], $res)) {
        $res[$items[0]] = [];
    }
    if (! in_array($items[1], $res[$items[0]])) {
        $res[$items[0]][] = $items[1];
    }
}
foreach ($res as $k => $v) {
     sort($res[$k]);
      echo $k . ": ";

     foreach ($v as $y){
        echo "[" . $y . "] ";
     }
 echo "<br />";
 }

【讨论】:

  • 非常感谢您,吉姆。您的代码运行良好,我只是纠正了一些简单的语法错误并添加了第二个 foreach 循环以获得我正在寻找的确切结果。
【解决方案2】:

你可以使用一个循环来做到这一点。

$brands = [
    'a' => [],
    'b' => []
];

foreach($array as $arr) {
    $rowData = explode('|', $arr);
    if($rowData[0] == 'BRAND A' && !in_array($rowData[1], $brands['a'])) {
        array_push($brands['a'], $rowData[1]);
    }
    if($rowData[0] == 'BRAND B' && !in_array($rowData[1], $brands['b'])) {
        array_push($brands['b'], $rowData[1]);
    }

}

这会给你结果:

$brands = [
    'a' => [
        'PERIOD 1',
        'PERIOD 2',
        'PERIOD 3'
    ],
    'b' => [
        'PERIOD 1'
    ]

];

【讨论】:

  • 非常感谢您,spencdev。您的代码也可以正常工作,而且您非常友善。我正在寻找一种不会在 If 循环中明确使用“品牌 A”或“品牌 B”的解决方案,因为该数组实际上可以继续使用“品牌 C”、“品牌 D”、“...”,所以$brand 变量需要自动定义:)
猜你喜欢
  • 2019-06-02
  • 2022-01-08
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多