删除数组切片中的重复项,保留所有其他部分中的重复值 [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'
]
];
我有这种数组:
$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'
]
];