Domanda

Molti linguaggi di programmazione hanno una funzione di coalescenza (restituisce il primo valore non NULL, esempio ). PHP, purtroppo nel 2009, no.

Quale sarebbe un buon modo per implementarne uno in PHP fino a quando PHP stesso non avrà una funzione di coalescenza?

È stato utile?

Soluzione

C'è un nuovo operatore in php 5.3 che fa questo: ?:

// A
echo 'A' ?: 'B';

// B
echo '' ?: 'B';

// B
echo false ?: 'B';

// B
echo null ?: 'B';

Fonte: http://www.php.net/ChangeLog-5. php # 5.3.0

Altri suggerimenti

PHP 7 ha introdotto un vero operatore di coesione :

echo 

PHP 7 ha introdotto un vero operatore di coesione :

<*>

Se il valore prima del ?? non esiste o è null , viene preso il valore dopo il ?? .

Il miglioramento rispetto al citato operatore ?: è che ?? gestisce anche variabili non definite senza lanciare un E_NOTICE .

GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'

Se il valore prima del ?? non esiste o è null , viene preso il valore dopo il ?? .

Il miglioramento rispetto al citato operatore ?: è che ?? gestisce anche variabili non definite senza lanciare un E_NOTICE .

Primo colpo per " php coalesce " su google.

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
      return $arg;
    }
  }
  return NULL;
}

http://drupial.com/content/php-coalesce

Mi piace molto l'operatore?:. Sfortunatamente, non è ancora implementato nel mio ambiente di produzione. Quindi uso l'equivalente di questo:

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}

Vale la pena notare che, a causa del trattamento con PHP delle variabili non inizializzate e degli indici di array, qualsiasi tipo di funzione di coalescenza è di utilità limitata. Mi piacerebbe poterlo fare:

$id = coalesce(

Vale la pena notare che, a causa del trattamento con PHP delle variabili non inizializzate e degli indici di array, qualsiasi tipo di funzione di coalescenza è di utilità limitata. Mi piacerebbe poterlo fare:

<*>

Ma questo, nella maggior parte dei casi, causerà errori PHP con un E_NOTICE. L'unico modo sicuro per testare l'esistenza di una variabile prima di usarla è usarla direttamente in empty () o isset (). L'operatore ternario suggerito da Kevin è l'opzione migliore se sai che tutte le opzioni della tua coalizione sono note per essere inizializzate.

GET['id'],

Vale la pena notare che, a causa del trattamento con PHP delle variabili non inizializzate e degli indici di array, qualsiasi tipo di funzione di coalescenza è di utilità limitata. Mi piacerebbe poterlo fare:

<*>

Ma questo, nella maggior parte dei casi, causerà errori PHP con un E_NOTICE. L'unico modo sicuro per testare l'esistenza di una variabile prima di usarla è usarla direttamente in empty () o isset (). L'operatore ternario suggerito da Kevin è l'opzione migliore se sai che tutte le opzioni della tua coalizione sono note per essere inizializzate.

SESSION['id'], null);

Ma questo, nella maggior parte dei casi, causerà errori PHP con un E_NOTICE. L'unico modo sicuro per testare l'esistenza di una variabile prima di usarla è usarla direttamente in empty () o isset (). L'operatore ternario suggerito da Kevin è l'opzione migliore se sai che tutte le opzioni della tua coalizione sono note per essere inizializzate.

Assicurati di identificare esattamente come vuoi che questa funzione funzioni con determinati tipi. PHP ha una vasta gamma di funzioni di controllo del tipo o simili, quindi assicurati di sapere come funzionano. Questo è un confronto di esempio tra is_null () e empty ()

$testData = array(
  'FALSE'   => FALSE
  ,'0'      => 0
  ,'"0"'    => "0"  
  ,'NULL'   => NULL
  ,'array()'=> array()
  ,'new stdClass()' => new stdClass()
  ,'$undef' => $undef
);

foreach ( $testData as $key => $var )
{
  echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
  echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not')  . " null<br>";
  echo '<hr>';
}

Come puoi vedere, empty () restituisce true per tutti questi, ma is_null () lo fa solo per 2 di essi.

Sto espandendo la risposta pubblicata da Ethan Kent . Tale risposta eliminerà gli argomenti non nulli che valutano come falsi a causa del funzionamento interno di array_filter , che non è in genere una funzione coalesce . Ad esempio:

echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
  

Spiacenti

Per ovviare a questo, sono richiesti un secondo argomento e la definizione della funzione. La funzione richiamabile è responsabile di dire a array_filter se aggiungere o meno il valore corrente dell'array all'array dei risultati:

// "callable"
function not_null($i){
    return !is_null($i);  // strictly non-null, 'isset' possibly not as much
}

function coalesce(){
    // pass callable to array_filter
    return array_shift(array_filter(func_get_args(), 'not_null'));
}

Sarebbe bello se potessi semplicemente passare isset o 'isset' come secondo argomento a array_filter , ma senza una tale fortuna.

Attualmente sto usando questo, ma mi chiedo se non potrebbe essere migliorato con alcune delle nuove funzionalità di PHP 5.

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
    return $arg;
    }
  }
  return $args[0];
}

PHP 5.3+, con chiusure:

function coalesce()
{
    return array_shift(array_filter(func_get_args(), function ($value) {
        return !is_null($value);
    }));
}

Demo: https://eval.in/187365

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top