【问题标题】:Deletion of element on a string not working, after conversion to an array转换为数组后,删除字符串上的元素不起作用
【发布时间】:2020-10-19 08:06:34
【问题描述】:

下面的代码解释了如何使用 unset 函数删除一个元素, 我使用了一个字符串并将该字符串转换为一个数组, 现在尝试删除第一个和最后一个元素。 但是元素不会被删除。 帮助将不胜感激

<?php
$string="Cupid";  //orginal string
$stringmod= str_split($string);  //converted the string to an array
$length= count($stringmod); //length of the string
for($i=0; $i<$length; $i++) 
{

    if($i == 0 || $i == $length-1) //condition to be executed
    {
        
        unset($stringmod[$i]); //delete elements
    
    }
    
}
print_r($stringmod);
?>

【问题讨论】:

  • length 更改为 $length... 并打开错误报告
  • 您可能会发现这个答案很有帮助,而不是遍历数组:stackoverflow.com/a/4669025/2453432
  • 长度是类型错误抱歉

标签: php


【解决方案1】:

关于您的代码,您在循环中的 length 之前缺少 $

尽管如此:不需要遍历数组——你可以直接寻址元素。以下将起作用:

<?php
   $string="Cupid";
   $stringmod= str_split($string);
   unset($stringmod[count($stringmod)-1]);
   unset($stringmod[0]);
   print_r($stringmod);
?>

函数 array_pop 和 array_shift 将执行相同的操作(从数组中删除最后一个/第一个元素)。如果您想稍后在代码中再次执行此操作,它们会更好(PHP 使用关联数组,因此 $stringmod[0] 只是开头的第一个元素 - 当您删除它时,不再有 $stringmod[0 ],因此执行 unset($stringmod[0]) 两次不会删除两个“第一个”元素,而只会删除一个)。所以在这种情况下,最好的答案可能是:

<?php
   $string="Cupid";
   $stringmod= str_split($string);
   array_pop($stringmod);
   array_shift($stringmod);
   print_r($stringmod);
?>

附:根据 Andrew 在我的回答下方的评论,您还可以使用 array_values() 函数重新排序或使用 array_splice() 删除元素(这也将重新排序)。就我个人而言,我不喜欢使用它们,因为它们占用资源,并且在可能的情况下,我不依赖于数组带有幻数的排序索引:)

【讨论】:

  • 要解决unset 扰乱索引的问题,您可以使用array_values 重新排序键。
  • 谢谢安德鲁。使用 array_splice 也是删除元素的一种选择 - 它也会重新排序,因此我们可以通过 array_splice($stringmod,0,1) 删除两次第一个元素。但是这些功能需要资源。我个人不喜欢使用它们。
【解决方案2】:

array_shift 将从数组中删除第一个元素,重新索引数字键。

array_pop 将删除最后一个。

$string="Cupid";  //orginal string
$stringmod= str_split($string); 

array_shift($stringmod);
array_pop($stringmod);

print_r($stringmod);

如果您想通过循环执行此操作,按照@jibsteroos comment,您几乎就在那里,您只需要在for 循环中正确引用测试计数器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多