Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Pasco
    Registrato dal
    Apr 2002
    Messaggi
    1,559

    problema con continue() dentro il ciclo foreach()

    Devo creare un nuovo array eliminando un elemento che prendo dal GET , ho pensato di ciclare l'array con foreach() e fare un semplice controllo tra i valori dell'array e quello del GET , il problema è che il controllo che dovrebbe essere vero almeno per una volta risulta sempre falso...

    codice:
    // $_REQUEST['numero'] = 'due';
    
    $file = file('file.txt');
    
    print_r($file);
    
    /* OUTPUT
    
    Array
    (
        [0] => uno
    
        [1] => due
    
        [2] => tre
    )
    
    */
    
    foreach($file as $val){
    
    	if($val == $_REQUEST['numero']):
    	
    		continue;
    		
    	else:
    	
    		$newArray[] = $val ;
    		
    	endif;
    	
    }
    
    print_r($newArray);
    
    /* OUTPUT
    
    Array
    (
        [0] => uno
    
        [1] => due
    
        [2] => tre
    )
    
    */
    la stessa cosa ho provato a svilupparla con altri linguaggi quali Python e Perl e non ho riscontrato problemi... la logica con php è forse diversa?
    PyFanatics

  2. #2
    codice:
    <?php
    $prova=array
    (
        "uno","due","tre",
    );
    
    foreach ($prova as $k => $v){
    if ($v!="due"){
    	$newarray[$k]=$v;
    }else{
    unset($prova[$k]);
    }
    }
    
    print_r($newarray);
    
    ?>

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    534
    Prova con array_diff().

    $new_array= array_diff($file,$_request);


  4. #4
    Utente di HTML.it L'avatar di Pasco
    Registrato dal
    Apr 2002
    Messaggi
    1,559
    Originariamente inviato da ellecubo
    codice:
    <?php
    $prova=array
    (
        "uno","due","tre",
    );
    
    foreach ($prova as $k => $v){
    if ($v!="due"){
    	$newarray[$k]=$v;
    }else{
    unset($prova[$k]);
    }
    }
    
    print_r($newarray);
    
    ?>
    mi spiace ma la logica non cambia , in termini di prestazioni e correttezza è più sensato usare continue()...

    cmq sia il tuo codice funziona , ma ha lo stesso problema del mio , ovvero se utilizzo

    codice:
    $prova=array
    (
        "uno","due","tre",
    );
    funziona , mentre se utilizzo

    codice:
    $prova = file('file.txt')
    mi salta il controllo dentro il foreach() , vi ricordo che print_r($prova) mi restituisce un array identico a quello che creo manualmente...

    magari abbiamo scoperto un bug di php5.0
    PyFanatics

  5. #5
    Utente di HTML.it L'avatar di Pasco
    Registrato dal
    Apr 2002
    Messaggi
    1,559
    Originariamente inviato da pierotto
    Prova con array_diff().

    $new_array= array_diff($file,$_request);

    la tua soluzione mantiene gli indici del vecchio array...
    PyFanatics

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    534
    Originariamente inviato da Pasco
    la tua soluzione mantiene gli indici del vecchio array...
    Come la soluzione di ellecubo d'altronde.

    basta fare sort() oppure rsort() per compattarli. Ma qual'è il contenuto di file.txt ? fai vedere l'output, ma sarebbe utile vedere come è scritto il file.


  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    534
    Visto il tuo problema.

    Quando generi l'array con file() viene aggiunto un carattere di fine riga, che viene valutato nella if.

    Passa la $val in rtrim().

    codice:
    foreach($file as $val){
    
    	if(rtrim($val) == $_REQUEST['numero']):
    	continue;
    	else:
    	$newArray[] = $val ;
    	endif;
    }
    
    print_r($newArray);

  8. #8
    Utente di HTML.it L'avatar di Pasco
    Registrato dal
    Apr 2002
    Messaggi
    1,559
    grazie mille

    non credevo che la <textarea> aggiungesse un ASCII 32 :rollo:
    PyFanatics

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    534
    Originariamente inviato da Pasco
    grazie mille

    non credevo che la <textarea> aggiungesse un ASCII 32 :rollo:
    di nulla.

    Attento che non è la text area, ma file() ad aggiungere uno spazio. Forse conviene mettere rtrim() anche per i dati che trasferisci di array. Ma credo tu l'abbia già fatto.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.