从数组的最后一个元素中删除末尾的不需要字符。

27

如何修改数组中的最后一个元素?

该数组看起来像这样:

$fields = array("firstName = 'Bob', ",
                "lastName = 'Smith', ",
                "email = 'bob@example.com', ",
                "address = '123 anystreet', ");
该数组是由脚本生成的,该脚本创建值并在每个字符串的末尾添加逗号/空格。我想仅从该数组的最后一个元素中删除逗号/空格。请记住,实际上值可能包含逗号/空格组合,因此只需要删除最后一个元素和最后两个字符的逗号/空格。我已经查看了end()函数,但我认为它不会有所帮助,因为它只获取值。 编辑:好的,所以我创建了这个函数/数组,以便我只有一个mysql函数来更新用户。有点像检测更改功能,而且它只传回所需/更改的字段。我没有意识到与此方法相关的问题。我认为,既然我已经在我的旧函数中编写了mysql查询,那么这种方式就不应该有问题。它所在的文件将无法让公众访问。我将使用最适合我的最佳答案,但我将搜索为什么这是有问题的,并且我希望可以得到关于这种方法的缺陷的评论/链接。

4
这看起来像是等待发生SQL注入的情况。 - Lightness Races in Orbit
@LightnessRacesinOrbit 我在生成此数组时使用mysqli_real_escape_string并对所有数据进行了净化处理,感谢关注。 - John the Ripper
1
为什么不直接使用键/值对呢?存储完整的SQL表达式只会导致问题,就像你现在遇到的这个问题一样。 - Lightness Races in Orbit
1
如果是针对数据库的话,你应该使用带有绑定变量的预处理语句。 - jeroen
我编写的函数接受两个用户对象并检查是否有任何更改。结果是这个数组。我这样做是为了将mysql函数的数量从10个减少到1个。在我的mysql文件中,我仍然必须硬编码SQL吗? - John the Ripper
这似乎是一个XY问题。在此阶段之前,输入数据应该更好地准备好。 - mickmackusa
9个回答

33

就像这样!

end($array);
$key = key($array);
reset($array);

5
如果数组是普通的数值型,Chris 的回答在我看来更好。如果数组是关联型的,只有这个才能起作用。 - John Dvorak
如果数组是关联数组,这个方法也能用吗?我本应该那样发帖:s - David Harris
3
取决于您想修改的是密钥还是值。使用$array[$key]来修改值,只需使用$key来修改键(但您已经知道了)。 - David Harris

16

有一种简写的方法可以做到这一点,但如果将其分解成几个部分,更容易理解:

$index = count( $fields ) - 1;
$value = $fields[$index];
$fields[$index] = preg_replace( "/,\ $/", "", $value );

2
不错。如果您只使用 rtrim($value, ' ,'); 而不是正则表达式,那就更好了。 - jeroen
1
或者只需使用substr函数删除最后两个字符。 - John Dvorak
2
@Jan Dvorak或者OP可以生成一个数组并使用, 进行implode,整个问题就会消失。 - jeroen
@DavidHarris,您不需要提前知道长度。知道空间是存在的确实有帮助-我认为这可以预期。 - John Dvorak
1
是的,问题中的输入是一个数值索引数组。 - Chris Ostmo
显示剩余3条评论

6

对于基本数组,使用Array pop和push是最简单的方法。 (我知道这不是技术问题,但许多人会在此处寻找与简单数组相关的答案)。

<?php

function update_last(&$array, $value){
    array_pop($array);
    array_push($array, $value);     
}

?>

然后您可以像这样使用该函数:

<?php

$array = [1,2,3];

update_last($array, 4); //$array = [1,2,4];

?>

6

要更改最后一个数字元素的值:

$lastValue = array_pop($fields);
$fields[] = rtrim(', ',$lastValue);

如果您正在为查询准备这些值,我建议在数组中存储所有内容而不使用逗号,需要时调用implode函数以避免尾随逗号问题。

4

有几种方式:

1) 对于关联数组,如果您不知道最后一个元素的键,最好先找到最后一个元素的键,然后更改其值。

$array[end((array_keys($array)))] .= ' additional text';

2) 如果您不知道或不关心密钥,可以删除最后一个元素并创建一个新的元素。

$array[] = array_pop($array).' additional text';

3
无论数组如何索引,都可以使用array_pop()来获取数组的最后一个元素。如果我们想要修改并再次添加它,这非常有用,因为您无法就地修改该元素。您所尝试的操作可以通过一行简单的代码完成:
$fields[] = preg_replace("/, $/", "", array_pop($fields));

就是这样。以下是它的功能:

  • preg_replace() 在字符串中搜索正则表达式模式,如果找到,则用替换字符串替换匹配项。

  • 我们要搜索的模式是/, $/,表示:仅在字符串的末尾($)匹配“,”(逗号+空格)。

  • 替换字符串只是一个空字符串(""),因此匹配项将从字符串中删除。

  • 我们想要对其执行替换的字符串是array_pop($fields),即数组$fields的最后一个元素,该元素也从该数组中删除。

  • 修改后的字符串然后重新添加到数组末尾($fields[] = 在没有显式键的情况下向数组添加元素,并使其成为新的最后一个元素)。

让我们来测试一下:

$fields = array(
    "firstName = 'Bob', ",
    "lastName = 'Smith', ",
    "email = 'bob@example.com', ",
    "address = '123 anystreet', ");

print "Before:\n\n";
print_r($fields);

$fields[] = preg_replace("/, $/", "", array_pop($fields));

print "\nAfter:\n\n";
print_r($fields);

输出:

Before:

Array
(
    [0] => firstName = 'Bob', 
    [1] => lastName = 'Smith', 
    [2] => email = 'bob@example.com', 
    [3] => address = '123 anystreet', 
)

After:

Array
(
    [0] => firstName = 'Bob', 
    [1] => lastName = 'Smith', 
    [2] => email = 'bob@example.com', 
    [3] => address = '123 anystreet'
)

注意到最后一个逗号不见了吗?你可以自己试一下

0

PHP 7 >= 7.3.0

$array[array_key_last($array)] = 'new value';

演示

$fields = array(
    "firstName = 'Bob', ",
    "lastName = 'Smith', ",
    "email = 'bob@example.com', ",
    "address = '123 anystreet', "
);

$last = $fields[array_key_last($fields)];
$last = preg_replace( "/, $/", "", $last);
$fields[array_key_last($fields)] = $last;

虽然array_key_last()是一个非常有价值和现代的工具,但这个答案并没有提供问题中所表达的期望输出。 - mickmackusa
@mickmackusa,被接受的答案是否没有这个缺点? - devope
@mickmackusa 这不是主要原因。我决定提交更一般的答案,因为这种任务更有价值,因为问题的当前标题是“修改数组中的最后一个元素”。 - devope
...但你没有修改最后一个元素。如果您不想回答此页面上发布的问题,请删除这个半回答并将其发布到更适合的页面上--只要确保您的建议不存在于此处。所有已发布的答案都必须解决已发布的问题。如果您不喜欢此问题的标题,请建议编辑。 - mickmackusa
我应该删除我的回答吗?还是可以在某些方面进行改进? - devope
显示剩余2条评论

0

今天偶然发现了这个。我认为最简单的非指针破坏方式是:

array_splice($array, -1, 1, strtolower(end(array_values($array))).'blah' );

当然,如果您不必关心指针,那么可以放弃使用array_values。 但我想知道这是否是一个好方法,因为splice的提取和替换操作可能比pop或其他操作更具有挑战性?


我认为对于这种情况,array_pop 比 array_splice 更简单。 - Yevgeniy Afanasyev

-1

我认为PHP的Implode函数可能是一个不错的选择,可以代替手动添加逗号。

如果不使用这个函数,你可能需要使用类似以下的方法:

$lastfield = $fields[count($fields)-1];
$lastfield = str_split($lastfield,strlen($lastfield)-2);
$fields[count($fields)-1] = $lastfield;

第一行和第三行是为了让第二行更易于阅读,但这很容易合并成一行。


这仅适用于数值数组。与关联数组失败。 - Yevgeniy Afanasyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接