为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕无忌1623718 2023-10-15 14:50:50
以下是代码<?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它对我来说太复杂了,我知道有一些聪明的人可以比我更有效地完成它。
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

您可以执行 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一定长度的数组


查看完整回答
反对 回复 2023-10-15
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

这是另一种方法。


$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。


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


$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


查看完整回答
反对 回复 2023-10-15
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

这似乎是一个经典的XY 问题。

基本行动只需:

  1. 用连字符分隔字符串中的子字符串。

  2. 验证每个子字符串中的字符格式正确并且对于该集合是唯一的。

  3. 仅对合格值采取有意义的行动。

您会看到,当您只真正需要验证输入数据时,替换/清理任何内容都没有任何好处。在输入中添加零只会在以后产生更多工作。

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

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);

        }

    }

}


查看完整回答
反对 回复 2023-10-15
  • 3 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信