以下是代码
<?php
$id ="202883-202882-202884-0";
$str = implode('-',array_unique(explode('-', $id)));
echo $str;
?>结果是
202883-202882-202884-0对于$id ="202883-202882-202882-0";,结果为202883-202882-0
我想用零替换重复的值,这样结果应该像202883-202882-0-0一样,而不仅仅是删除它。
对于$id ="202883-0-0-0";,结果应该是202883-0-0-0。不应替换零,允许重复零。我怎么才能把它归档?
更多信息:
我想把所有重复的号码都换掉。因为这是一个产品比较网站。最多只能有4个数字。每个数字都是一个6位数字或一个数字零。全零表示未选择任何产品。一个6位数字和3个零表示,选择一个产品,3个空白。
每个6位数字将收集数据库中的数据,我不想让用户输入相同的数字多次(只会发生的数字是手动添加的网址。)
更新:我知道我的问题不清楚,可能是我的英语不好。这里有更多的解释,这个功能是为智能手机比较网站。URL格式为sitename.com/compare.html?id=202883-202882-202889-202888。这三个号码都是不同的智能手机(它们的数据库产品ID)。我不想让用户像id=202883-202882-202882-202888一样输入相同的产品ID。它不会在网站中显示两个202882结果,但会导致一些小问题。网址将保持不变,但内部PHP代码应将其视为id=202883-202882-202888-0。重复项应替换为零并添加到末尾。将只有4个用"-“分隔的数字。下面的例子可能会让你大失所望!
如果为pid=202883-202882-202889-202888,则结果应为202883-202882-202889-202888;如果为pid=202883-202883-202883-202888,则结果应为202888-0-0-0;如果为pid=202883-202882-202883-202888,则结果为202883-202882-202888-0;如果为pid=202882-202882-202882-202882,则结果应为202882-0-0-0
我想只允许6位数字或单个数字零通过字符串。
如果为pid=rgfsdg-fgsdfr4354-202883-0,则结果应为202883-0-0-0;如果为pid=fasdfasd-asdfads-adsfds-dasfad,则结果应为0-0-0-0;如果为pid=4354-45882-445202882-202882,则结果应为202882-0-0-0
这对我来说太复杂了,我知道那里有聪明的头脑,他们可以比我更有效地完成它。
发布于 2020-08-16 13:15:13
您可以执行array_unique (保留密钥),然后使用0填充空白。按键排序,就完成了:)
数组上的+将unify数组,但会优先处理左边的数组。
代码
$input = "0-1-1-3-1-1-3-5-0";
$array = explode('-', $input);
$result = array_unique($array) + array_fill(0, count($array), 0);
ksort($result);
var_dump(implode('-',$result));代码(v2 -由mickmackusa建议)-更短且更容易理解
填充输入数组大小的数组。并替换为array_unique中的剩余值。不需要ksort。将在array_unique的保留键处替换0%s。
$input = "0-1-1-3-1-1-3-5-0";
$array = explode('-', $input);
$result = array_replace(array_fill(0, count($array), 0), array_unique($array));
var_export($result);工作example。
输出
string(17) "0-1-0-3-0-0-0-5-0"工作example。
参考文献
0的数组发布于 2020-08-16 12:44:44
这是另一种方法。
$id = "202883-202882-202882-0-234567-2-2-45435";根据字符串,将字符串分解为基于分隔符的数组,在本例中为'-'/
$id_array = explode('-', $id);然后我们可以遍历数组,对于找到的每个唯一条目,我们可以将其存储在另一个数组中。因此,当我们在数组中搜索时,我们正在构建一个数组。
$id_array_temp = [];
// Loop through the array
foreach ($id_array as $value) {
if ( in_array($value, $id_array_temp)) {
// If the entry exists, replace it with a 0
$id_array_temp[] = 0;
} else {
// If the entry does not exist, save the value so we can inspect it on the next loop.
$id_array_temp[] = $value;
}
}在此操作结束时,我们将有一个由唯一值组成的数组,其中所有重复项都将替换为0。
要重新创建字符串,我们可以使用内爆...
$str = implode('-', $id_array_temp);
echo $str;重构这一点,使用三元替换If,else...
$id_array = explode('-', $id);
$id_array_temp = [];
foreach ($id_array as $value) {
$id_array_temp[] = in_array($value, $id_array_temp) ? 0 : $value;
}
$str = implode('-', $id_array_temp);
echo $str;输出为
202883-202882-0-0-234567-2-0-45435发布于 2020-08-16 20:19:38
这似乎是一个经典的XY Problem。
基本操作只需要:
在以连字符分隔的string.
您知道,当您只需要验证输入数据时,替换/清理任何内容都没有任何好处。将零添加到输入只会在以后创建更多的工作。
简而言之,您应该使用类似于此流程的直接方法:
if (!empty($_GET['id'])) {
$ids = array_unique(explode('-', $_GET['id']));
foreach ($ids as $id) {
if (ctype_digit($id) && strlen($id) === 6) {
// or: if (preg_match('~^\d{6}$~', $id)) {
takeYourNecessaryAction($id);
}
}
}https://stackoverflow.com/questions/63433134
复制相似问题