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

时间:2017-07-22 01:32:46

标签: php array-unique

我有这种阵列:

$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" array只包含一个唯一值:Period 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;

非常欢迎任何获得理想结果的建议。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

我还没有测试过这段代码,但我认为它能为您提供所需的代码。

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

答案 1 :(得分:0)

您可以使用一个循环执行此操作。

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

];