删除数组切片中的重复项,保留所有其他部分中的重复值 [PHP]

Remove duplicates in a slice of arrays, preserving recurring values in all other parts [PHP]

我有这种数组:

$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] 

"Brand B" 数组仅包含唯一值:Period 1,但脚本会打印 "Brand 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;

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

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

$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 />";
 }

您可以使用一个循环来完成此操作。

$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'
    ]

];