【问题标题】:Comparing and increasing string value with FOR loop用 FOR 循环比较和增加字符串值
【发布时间】:2017-05-31 21:02:38
【问题描述】:

我正在尝试将新字符串与数据库中的旧字符串进行比较,如果该字符串存在,则将其加一,例如,如果字符串 car 存在,则新字符串应为 car-1 如果该字符串存在则 car-2...

我正在使用 Laravel,并通过使用 while() 循环实现了这一点,但我也想使用 for() 循环来做到这一点。 p>

这是我的有效代码:

foreach($lang_codes as $key => $value)
{               
    $oldAlias = str_slug($request->{"new_category_lang_{$value->code}"}, '-');
    $newAlias = $oldAlias;
    $aliasCheck = ShopCategoryName::where('alias', $oldAlias)->first();
    $newCategory = new ShopCategoryName;

    $i = 1;
    while ($aliasCheck) 
    {
        $newAlias = $oldAlias . '-' . $i;
        $aliasCheck = ShopCategoryName::where('alias', $newAlias)->first();
        $i++;
    }
}

我试图将 strcmp()for() 循环一起使用,但我不知道如何将这些代码放在一起,太乱了。 p>

所以基本上,我正在尝试使用上面的代码来处理 for() 循环,但是我的大脑已经阻塞并且过于复杂了。

【问题讨论】:

  • 我看不出循环的改变会做什么。此外,该代码似乎正在解决一些问题,但您正在询问将一个循环换成另一个循环 - 这对代码样式或可读性没有影响。不同之处在于删除该代码并让您的数据库完成所有工作。我们有触发器、我们有存储过程、我们有事件 - 所有这些都是强大的工具,您可以使用它们让您的数据库包含您想要的数据。这些方法中的任何一个都不会以让您简单地删除这段代码的方式解决您的问题吗?
  • 因为我想学习如何使用 for 循环,仅此而已。以不同的方式编写代码!
  • 作为@N.B.解释说,您的 while 循环实际上非常适合这种情况。为什么?因为您的循环基于 true 或 false(当 $aliasCheck 存在时,请执行此操作)。尝试在 for 循环中编写此代码将导致编写更多代码。当你有一个已知的终点时,for 循环会更好,例如:在数据库中插入 10 个项目最适合使用 for 循环 (for($i = 1; $i <= 10; $i++) { })。
  • 用while循环没问题,这种情况下不用for循环。

标签: php laravel for-loop


【解决方案1】:

这部分

$i = 1;
while ($aliasCheck) 
{
    $newAlias = $oldAlias . '-' . $i;
    $aliasCheck = ShopCategoryName::where('alias', $newAlias)->first();
    $i++;
}

等价于

for ($i = 1; $aliasCheck; $i++) 
{
    $newAlias = $oldAlias . '-' . $i;
    $aliasCheck = ShopCategoryName::where('alias', $newAlias)->first();
}

您还可以将代码重写为:

$oldAlias = str_slug($request->{"new_category_lang_{$value->code}"}, '-');
$newAlias = $oldAlias;
$newCategory = new ShopCategoryName; // <-- not sure what that is good for

for ($i = 1; ShopCategoryName::where('alias', $newAlias)->exists(); ++$i) 
{
    $newAlias = $oldAlias . '-' . $i;
}

【讨论】:

  • 太棒了,从来没有想过这么简单的解决方案。我什至不知道我可以只用变量编写 for 循环而不给它条件运算符。 $newCategory = 新的 ShopCategoryName; // =>这是代码的另一部分,它在检查别名是否存在后在数据表中创建新行,因为这对这个问题无关紧要 I˙v cut出来。感谢您的解决方案
  • 我有一个关于最后一段代码的问题,当我将 ShopCategoryName::where('alias', $newAlias)-&gt;exists(); 放入变量中时,我在 ShopsController.php 第 346 行得到了 FatalErrorException:超过了 30 秒的最大执行时间,在编写完整查询时它可以正常工作,就像您所做的那样。这是为什么?而且,++$i 而不是 $i++ 是否有返回值的方式? ++$i 会增加$i 的值,然后返回增加的值,而$i++ 会增加$i 的值,但返回$i 在增加之前保持的值。
  • 变量的值在循环内不会改变。所以如果一开始它的值为TRUE,它会一直保持为TRUE,并且循环不会退出(无限循环)。您对 ++ 运算符的描述是正确的。如果您不使用返回值,逻辑上没有区别。但是++$i 快一点(比如 2%)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多