首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PHP字符串中的重复值替换为零

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

Stack Overflow用户
提问于 2020-08-16 12:24:22
回答 3查看 162关注 0票数 0

以下是代码

代码语言:javascript
复制
<?php
$id ="202883-202882-202884-0";
$str = implode('-',array_unique(explode('-', $id)));
echo $str;
?>

结果是

代码语言:javascript
复制
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

这对我来说太复杂了,我知道那里有聪明的头脑,他们可以比我更有效地完成它。

EN

回答 3

Stack Overflow用户

发布于 2020-08-16 13:15:13

您可以执行array_unique (保留密钥),然后使用0填充空白。按键排序,就完成了:)

数组上的+unify数组,但会优先处理左边的数组。

代码

代码语言:javascript
复制
$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。

代码语言:javascript
复制
$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

输出

代码语言:javascript
复制
string(17) "0-1-0-3-0-0-0-5-0"

工作example

参考文献

  • ksort - sort by key
  • array_fill -生成一个填充了一定长度的0的数组
票数 4
EN

Stack Overflow用户

发布于 2020-08-16 12:44:44

这是另一种方法。

代码语言:javascript
复制
$id = "202883-202882-202882-0-234567-2-2-45435";

根据字符串,将字符串分解为基于分隔符的数组,在本例中为'-'/

代码语言:javascript
复制
$id_array = explode('-', $id);

然后我们可以遍历数组,对于找到的每个唯一条目,我们可以将其存储在另一个数组中。因此,当我们在数组中搜索时,我们正在构建一个数组。

代码语言:javascript
复制
$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。

要重新创建字符串,我们可以使用内爆...

代码语言:javascript
复制
$str = implode('-', $id_array_temp);
echo $str;

重构这一点,使用三元替换If,else...

代码语言:javascript
复制
$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;

输出为

代码语言:javascript
复制
202883-202882-0-0-234567-2-0-45435
票数 1
EN

Stack Overflow用户

发布于 2020-08-16 20:19:38

这似乎是一个经典的XY Problem

基本操作只需要:

在以连字符分隔的string.

  • Validate中,
  1. 分隔子字符串,以确保每个子字符串中的字符格式正确且对集合唯一。
  2. 仅对限定值执行有意义的操作。

您知道,当您只需要验证输入数据时,替换/清理任何内容都没有任何好处。将零添加到输入只会在以后创建更多的工作。

简而言之,您应该使用类似于此流程的直接方法:

代码语言:javascript
复制
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);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63433134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档