John the Ripper
John the Ripper

Reputation: 2439

Trim unwanted characters from the end of the last element in an array

How do I modify the last element in an array?

The array looks like this:

$fields = array("firstName = 'Bob', ",
                "lastName = 'Smith', ",
                "email = '[email protected]', ",
                "address = '123 anystreet', ");

The array is generated by a script which creates the values and adds the comma/space at the end of each string. I want to remove that comma/space from only the last element in that array. Keep in mind that the values could in fact contain a comma/space combination so only the last element and the last two characters of the last element need to be removed.

I've looked at the end() function but I don't think that is going to help since it just gets the value.

Edit Ok so I created this function/array so that I would only have one mysql function to update users. Sort of like a detect changes function and it only passes back the required/changed fields. I didn't realize there were problems associated with this approach. I thought that since I already had the mysql queries written in my old functions there shouldn't be an issue with this way. The file that it's in will not be accessible to the public. I'm going to use the best answer that works for me but I'm going to search for why this is problematic and I would appreciate comments/links as to what is wrong with this approach.

Upvotes: 27

Views: 44900

Answers (9)

devope
devope

Reputation: 246

PHP 7 >= 7.3.0

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

Demo

$fields = array(
    "firstName = 'Bob', ",
    "lastName = 'Smith', ",
    "email = '[email protected]', ",
    "address = '123 anystreet', "
);

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

Upvotes: 0

Mecki
Mecki

Reputation: 133059

The last element of an array can always be retrieved using array_pop(), no matter how the array is indexed. It will also remove that element from the array, which is very useful if we want to modify and then add it again, as you cannot modify the element in-place.

What you are trying to do can be done with a simple, single line of code:

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

That's it. Here's what it does:

  • preg_replace() searches for a Regex pattern in a string and if found, replaces the match with an alternative string.

  • The pattern we search for is /, $/, which means: Match for ", " (comma + space) but only if it is at the very end of the string ($).

  • The replacement string is simply an empty string (""), thus the match is just deleted from the string.

  • The string we want to perform that replacement on is array_pop($fields), the last element of the array $fields, which is also removed from that array.

  • The modified string is then re-added to the array at the end ($fields[] = adds an element to an array without an explicit key and makes it the new last element).

Let's test it:

$fields = array(
    "firstName = 'Bob', ",
    "lastName = 'Smith', ",
    "email = '[email protected]', ",
    "address = '123 anystreet', ");

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

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

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

Output:

Before:

Array
(
    [0] => firstName = 'Bob', 
    [1] => lastName = 'Smith', 
    [2] => email = '[email protected]', 
    [3] => address = '123 anystreet', 
)

After:

Array
(
    [0] => firstName = 'Bob', 
    [1] => lastName = 'Smith', 
    [2] => email = '[email protected]', 
    [3] => address = '123 anystreet'
)

Note how the last comma is gone? Just try it yourself.

Upvotes: 3

Daniel Tonon
Daniel Tonon

Reputation: 10472

Array pop and push are the easiest way to do it for basic arrays. (I know that isn't technically the question but many people will come here looking for the answer in relation to simple arrays as well).

<?php

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

?>

Then you can use the function like this:

<?php

$array = [1,2,3];

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

?>

Upvotes: 6

Yevgeniy Afanasyev
Yevgeniy Afanasyev

Reputation: 41390

There are few ways:

1) For associative arrays, if you don't know the last element key, you better find the last element key first and change its value.

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

2) if you don't know and don't care about keys, you can cut the last element and create a new one.

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

Upvotes: 4

arcanine
arcanine

Reputation: 1953

To change the value of the last numeric element:

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

If you are preparing these values for a query I would suggest storing everything without commas in an array then calling implode on that array when needed to prevent trailing comma problems

Upvotes: 6

n&#239;k&#246;
n&#239;k&#246;

Reputation: 109

stumbled upon this today. i think the easiest non-pointer-breaking way would be:

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

of course you can drop array_values if you dont have to care for the pointer. but i wonder if this is a good way, since the extract-n-replace-stuff of splice could be more demanding than a pop or sth?

Upvotes: 0

Quentin Skousen
Quentin Skousen

Reputation: 1055

I think PHP's Implode function might be a good alternative, instead of generating the commas yourself.

Barring that, you would have to use something like:

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

The first and third lines are included to make the second line easier to read, but this could easily be compounded to one line.

Upvotes: -1

Chris Ostmo
Chris Ostmo

Reputation: 1252

There's a shorthand way to do this, but it's easier to follow if it's broken out into pieces:

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

Upvotes: 16

David Harris
David Harris

Reputation: 2707

Like this!

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

Upvotes: 33

Related Questions