Domanda

C'è una differenza o è migliore dell'altra delle seguenti:

$var = '';
...
$var .= 'blah blah';
$var .= $var2;
$var .= 'blah blah';

o

$var = '';
...
$var .= 'blah blah' . $var2 . 'blah blah';

C'è una differenza di velocità o c'è un motivo per cui sceglieresti uno sopra l'altro?

È stato utile?

Soluzione

C'è una piccola differenza se si fa eco alla stringa.

echo $var1,$var2,$var3 // comma (echo with multiple arguments)

è leggermente più veloce di

echo $var1.$var2.$var3 // dot   (concat and echo)

Altri suggerimenti

Sia PEZ che Topbit sono corretti. Voglio solo sottolineare qualcosa che penso sia migliore di quello che è stato visto qui:

$var  = "line 1 \n";
$var .= "line 2 \n";

vs

$var = "line 1 \n"
     . "line 2 \n";

Preferisco di gran lunga la seconda alla prima poiché visivamente è ovvio che il tuo risultato è l'unica stringa $ var. Previene anche bug stupidi come:

$var  = "line 1 \n";
$var .= "line 2 \n";
$vat .= "line 3 \n";
$var .= "line 4 \n";

Non importa per alcune stringhe brevi. Usa tutto ciò che è più chiaro da leggere.

Ma se ne hai molti (diciamo migliaia) non così brevi, probabilmente vorrai tenerli in un array e unirli insieme. (Come spesso accade, tale codice è spesso facile da leggere quanto concatenare le stringhe usando ". = & Quot ;, quindi non stai sacrificando la chiarezza sull'altare della performance.)

EDIT: non penso che il mio pensiero sopra sia valido. Le stringhe di PHP sono mutabili, giusto?

Non farà differenza. Entrambi sono concatenati, quindi tutto ciò che è più facile da leggere è ciò che dovresti usare.

Se stai cercando le migliori prestazioni, prova a usare un array e poi implodalo quando hai finito.

$var = array();
$var[] = "line 1\n";
$var[] = "line 2\n";
$var[] = "line 3";
$var = implode('', $var);

Ad ogni modo, la differenza di velocità sarà trascurabile a meno che tu non stia lavorando con migliaia di corde grandi.

Per tutto ciò che stai concatenando manualmente nel codice, probabilmente le prestazioni non contano, quindi la leggibilità è fondamentale. Per me, questo spesso significa usare sintassi di heredoc . Non mi piace il modo in cui rompe la mia struttura di rientro, ma è particolarmente bello quando vuoi che le interruzioni di riga e / o le schede siano inserite correttamente nelle tue stringhe.

Non credo che noterai per una situazione così breve. In genere decido per motivi di leggibilità che userò. Mi sono diviso solo in due situazioni, altrimenti su una riga:

a) Creazione di una risposta multilinea in modo che il codice imiti in qualche modo ciò che l'utente vedrà. Ho scoperto che rende più facile rilevare errori di battitura ed errori in questo modo.

$var  = "line 1 \n";
$var .= "line 2 \n";

b) lunghezza della linea. Se la linea traboccerà dalla mia finestra, in genere la romperò, quindi non devo andare alla fine della riga per leggere la fine. La maggior parte delle lingue supporta un carattere di continuazione della linea, quindi non ho davvero bisogno di romperlo fisicamente nel codice, ma solo un'abitudine che ho dato che lavoro in alcune lingue che non lo hanno.

Il modo più veloce per ottenere una grande quantità di dati in una singola stringa è il buffering dell'output per catturare l'output echo.

ob_start();
/* many echos. For example, in a loop */
$outString = ob_get_contents(); // get the complete string
ob_end_clean();

In generale, è improbabile che faccia una differenza significativa nella velocità del tuo programma, quindi fai sembrare ovvio ciò che stai facendo, dato che devi comunque tornare a risolverlo / aggiornarlo in seguito. La leggibilità è re.

Non c'è differenza significativa. È solo una questione di preferenze di codifica.

Ho avuto la sensazione che fare un array e poi implodere potesse essere il modo più veloce. Mi sbagliavo! Tuttavia, fare $ str = $ str + $ bla è DAVVERO lento per ordine di grandezza! Importa solo se stai facendo un sacco di concatenazioni. Ecco il mio codice di prova:

<?php

function doit($n) {

    $str2concat = 'Esta es una prueba. ¿Cuál manera es más rápida?';

    $str = '';

    // option 1
    $start = microtime(true);

    for( $i=0; $i <= $n; $i++ ) {
        $str .= $str2concat;
    }

    $end = microtime(true);
    echo " Concat: $n Iterations, duration:" . ($end-$start) . "\n";

    // option 2
    $str = '';
    $start = microtime(true);

    for( $i=0; $i <= $n; $i++ ) {
        $str = $str . $str2concat;
    }

    $end = microtime(true);
    echo "Concat2: $n Iterations, duration:" . ($end-$start) . "\n";

    // option 3
    $str = [];
    $start = microtime(true);

    for( $i=0; $i <= $n; $i++ ) {
        $str[] = $str2concat;
    }

    $str = implode( $str );
    $end = microtime(true);
    echo "Implode: $n Iterations, duration:" . ($end-$start) . "\n\n";

}

doit( 5000 );
doit( 10000 );
doit( 100000 );

Ecco i risultati che ho ottenuto:

 Concat: 5000 Iterations, duration:0.0031819343566895
Concat2: 5000 Iterations, duration:0.41280508041382
Implode: 5000 Iterations, duration:0.0094010829925537

 Concat: 10000 Iterations, duration:0.0071289539337158
Concat2: 10000 Iterations, duration:1.776113986969
Implode: 10000 Iterations, duration:0.013410091400146

 Concat: 100000 Iterations, duration:0.06755805015564
Concat2: 100000 Iterations, duration:264.86760401726
Implode: 100000 Iterations, duration:0.12707781791687
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top