2012-12-31 13 views
11

Come si modifica l'ultimo elemento in un array?Modificare l'ultimo elemento in un array

L'array assomiglia a questo:

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

L'array è generata da uno script che crea i valori e aggiunge la virgola/spazio alla fine di ogni stringa. Voglio rimuovere quella virgola/spazio solo dall'ultimo elemento di quell'array. Tieni presente che i valori potrebbero infatti contenere una combinazione di virgola/spazio, pertanto è necessario rimuovere solo l'ultimo elemento e gli ultimi due caratteri dell'ultimo elemento.

Ho esaminato la funzione end() ma non penso che sarà di aiuto in quanto ottiene solo il valore.

Modifica Ok, quindi ho creato questa funzione/array in modo che avrei solo una funzione mysql per aggiornare gli utenti. Un po 'come una funzione di rilevamento delle modifiche e restituisce solo i campi richiesti/modificati. Non avevo capito che c'erano problemi associati a questo approccio. Ho pensato che dal momento che avevo già le query mysql scritte nelle mie vecchie funzioni non ci dovrebbe essere un problema con questo modo. Il file in cui è inserito non sarà accessibile al pubblico. Userò la risposta migliore che funziona per me, ma cercherò perché questo è problematico e gradirei commenti/link su cosa c'è di sbagliato in questo approccio. Grazie.

+2

Questo appare come SQL injection in attesa di accadere –

+0

@LightnessRacesinOrbit sto usando mysqli_real_escape_string nella generazione di questa matrice e sanificazione di tutti i dati in anticipo , grazie per l'interessamento. –

+1

Ancora. Perché non usare le coppie chiave/valore in modo nativo? La memorizzazione di espressioni SQL complete causa solo problemi, come quello che stai vivendo ora. –

risposta

25

Come questo!

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

Se l'array è di tipo numerico ordinario, la risposta di Chris è migliore. IMO. Se l'array è associativo, funzionerà solo questo. –

+0

"Funzionerà anche se l'array è associativo? Avrei dovuto postarlo in quel modo: s" –

+0

Sì, questo aiuta :-) –

8

C'è un modo veloce per fare questo, ma è più facile da seguire se si è rotto fuori in pezzi:

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

Nice. Sarebbe anche meglio se tu usassi semplicemente 'rtrim ($ value, ',');' invece di un'espressione regolare. – jeroen

+1

o semplicemente rimuovi gli ultimi due caratteri con un 'substr'ing. –

+2

@Jan Dvorak O l'OP potrebbe generare un array e implodere con ',' e l'intero problema scomparirà. – jeroen

-1

Credo che la funzione di PHP Implode potrebbe essere una buona alternativa, invece di generare le virgole te stesso.

A parte ciò, si dovrà usare qualcosa di simile:

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

La prima e la terza linea sono inclusi per rendere la seconda linea più facile da leggere, ma questo potrebbe essere facilmente aggravata ad una linea.

+0

Funziona solo se si dispone di matrici numeriche. Non riesce con gli array associati. –

0

inciampato su questo oggi. Penso che il modo più semplice non-pointer-rottura sarebbe:

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

, naturalmente, si può scendere array_values ​​se non avete per la cura per il puntatore. ma mi chiedo se questo è un buon modo, dal momento che l'estratto-n-sostituzione-stuff di giunzione potrebbe essere più esigenti di un pop o sth?

+0

Penso che array_pop sia più semplice di array_splice per questo caso. –

+0

a destra, sembra essere più veloce –

3

Per modificare il valore dell'ultimo elemento numerico:

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

Se si sta preparando questi valori per una query vorrei suggerire la memorizzazione di tutto senza virgole in un array quindi chiamando implodere su tale array quando necessario per prevenire trailing problemi virgola

0

ci sono pochi modi:

1) Per gli array associativi, se non si conosce l'ultima chiave elemento, è meglio trovare l'ultimo elemento chiave prima e modificarne il valore.

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

2) se non si conosce e non si cura di chiavi, è possibile tagliare l'ultimo elemento e crearne uno nuovo.

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

Il pop e il push di array sono il modo più semplice per farlo per gli array di base. (So ​​che non è tecnicamente la domanda, ma molte persone verranno qui a cercare la risposta anche in relazione agli array semplici).

<?php 

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

?> 

quindi è possibile utilizzare la funzione in questo modo:

<?php 

$array = [1,2,3]; 

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

?> 
Problemi correlati