猿问

将 PHP 字符串中的重复值替换为零

以下是代码


<?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 位数字或一位数零。全零表示未选择任何产品。1 个 6 位数字和 3 个零表示,1 个产品已选择,3 个空白。


每个 6 位数字都会从数据库收集数据,我不想允许用户多次输入相同的数字(只有手动添加 URL 时才会发生)。


更新:我知道我的问题不清楚,可能是我的英语很差。这里有更多解释,这个功能是针对智能手机比较网站的。网址格式为sitename.com/compare.html?id=202883-202882-202889-202888. 这三个数字都是不同的智能手机(它们的数据库产品 ID)。我不想让用户输入相同的产品 ID,例如id=202883-202882-202882-202888. 它不会在网站中显示两个202882结果,但会引起一些小问题。URL 将保持不变,但内部 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


它对我来说太复杂了,我知道有一些聪明的人可以比我更有效地完成它。


慕无忌1623718
浏览 109回答 3
3回答

Qyouu

您可以执行 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 - 由 micmackusa 建议) - 更短且更易于理解填充输入数组大小的数组。并替换为 中的剩余值array_unique。不需要ksort。0s 将被替换为 的保留键array_unique。$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);工作示例。输出string(17) "0-1-0-3-0-0-0-5-0"工作示例。参考ksort - 按键排序array_fill - 生成一个填充0一定长度的数组

慕尼黑8549860

这是另一种方法。$id = "202883-202882-202882-0-234567-2-2-45435";从字符串中,您根据分隔符将字符串分解为数组,在本例中为“-”/$id_array = explode('-', $id);然后我们可以循环遍历该数组,对于找到的每个唯一条目,我们可以将其存储在另一个数组中。因此,当我们搜索数组时,我们正在构建一个数组。$id_array_temp = [];// Loop through the arrayforeach ($id_array as $value) {&nbsp; &nbsp; if ( in_array($value, $id_array_temp)) {&nbsp; &nbsp; &nbsp; &nbsp; // If the entry exists, replace it with a 0&nbsp; &nbsp; &nbsp; &nbsp; $id_array_temp[] = 0;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; // If the entry does not exist, save the value so we can inspect it on the next loop.&nbsp; &nbsp; &nbsp; &nbsp; $id_array_temp[] = $value;&nbsp; &nbsp; }}在此操作结束时,我们将得到一个唯一值数组,其中任何重复项都将替换为 0。要重新创建字符串,我们可以使用 implode...$str = implode('-', $id_array_temp);echo $str;重构这个,使用三元来代替 If,else...$id_array = explode('-', $id);$id_array_temp = [];foreach ($id_array as $value) {&nbsp; &nbsp; $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

叮当猫咪

这似乎是一个经典的XY 问题。基本行动只需:用连字符分隔字符串中的子字符串。验证每个子字符串中的字符格式正确并且对于该集合是唯一的。仅对合格值采取有意义的行动。您会看到,当您只真正需要验证输入数据时,替换/清理任何内容都没有任何好处。在输入中添加零只会在以后产生更多工作。简而言之,您应该使用类似于此流程的直接方法: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);        }    }}
随时随地看视频慕课网APP
我要回答