Değişkenler kümesi için koşullu biçimlendirme ve noktalama ekleme

7 Cevap php

Ben sık sık virgül, boşluk veya noktalama ayrılmış öğeleri listesi gerekir adresleri (! Bu bir adres için overkill olduğunu ve bir örnek uğruna) klasik bir örneğidir:

echo "L$level, $unit/$num $street, $suburb, $state $postcode, $country.";
//ouput: L2, 1/123 Cool St, Funky Town, ABC 2000, Australia.

Göründüğü kadar basit, "şartlı" değişkeni varsa yalnızca değişkenler arasındaki özel ayırıcılar eklemek için kolay bir yol var mı? Her değişken ayarlanmış olup olmadığını kontrol etmek gerekli midir? Az detaylar Yani yukarıdaki kullanarak, başka bir adres olabilir çıkış gibi bir şey:

//L, / Cool St, , ABC , .

Kontrol bir biraz zorlu yolu her değişken ayarlanmış olup olmadığını görmek ve noktalama görüntülemek için olacaktır.

if($level){ echo "L$level, "; }
if($unit){ echo "$unit"; }
if($unit && $street){ echo "/"; }
if($street){ echo "$street, "; }
if($suburb){ echo "$suburb, "; }
//etc...

Bu otomatik olarak tüm sıyırma / formatlama vb yapabileceği bir işlevi olması iyi olurdu:

somefunction("$unit/$num $street, $suburb, $state $postcode, $country.");


Başka bir örnek, basit bir csv listesi. Ben virgülle ayırarak çıkışı x öğeleri istiyorum:

for($i=0; $i=<5; $i++;){ echo "$i,"; }
//output: 1,2,3,4,5,

Örneğin bir döngü içinde, bir dizi ya da döngü durumun son öğeyi belirlemenin en iyi yolu nedir listenin sonunda bir virgül değil bir araya geldi? Ben okudum bu etrafında uzun bir yol gibi ilk giriş şeyin dışında bir virgül before bir öğe koymak için:

$firstItem = true; //first item shouldn't have comma
for($i=0; $i=<5; $i++;){
  if(!$firstItem){ echo ","; }
  echo "$i";
  $firstItem = false;
}

7 Cevap

İlk Örneğin, istenen sonucu elde etmek için dizi yöntemlerden birkaçı ile birlikte dizileri kullanabilirsiniz. Örneğin:

echo join(', ', array_filter(array("L$level", join(' ', array_filter(array(join('/', array_filter(array($unit, $num))), $street))), $suburb, join(' ', array_filter(array($state, $postcode))), $country))) . '.';

Bu one-liner yüzden bir zaman dizisi, array_filter sarın ve ayrı bir yöntem haline çağrıları katılmak ve bu kullanabilir, okumak oldukça karmaşıktır:

function merge($delimiter)
{
    $args = func_get_args();
    array_shift($args);
    return join($delimiter, array_filter($args));
}

echo merge(', ', "L$level", merge(' ', merge('/', $unit, $num), $street), $suburb, merge(' ', $state, $postcode), $country) . '.';

Aksi takdirde delimeters hala basılmış olacaktır, boş girdileri kaldırmak için array_filter aramaları gerekir.

Ikinci Örneğin, bir diziye öğe eklemek, sonra delimeter eklemek için join kullanın:

$arr = array();
for($i=0; $i=<5; $i++)
{
    $arr[] = $i;
}
echo(join(',', $arr));

Phillip'in cevabı sorununu da, ben Eric Lippert tarafından aşağıdaki blog yazısı ile tamamlamak istedi. Onun tartışma c # olmasına rağmen, herhangi bir programlama dili için geçerlidir.

Ikinci soruna basit bir çözüm var:

for($i=0; $i<=5; $i++)
    $o .= "$i,";
echo chop($o, ',');

Tamam, al! (Ama çok ciddi değil ^ ^)

<?php

function bothOrSingle($left, $infix, $right) {
    return $left && $right ? $left . $infix . $right : ($left ? $left : ($right ? $right : null));
}

function leftOrNull($left, $postfix) {
    return $left ? $left . $postfix : null;
}

function rightOrNull($prefix, $right) {
    return $right ? $prefix . $right : null; 
}

function joinargs() {
    $args = func_get_args();
    foreach ($args as $key => $arg) 
        if (!trim($arg)) 
            unset($args[$key]);

    $sep = array_shift($args);
    return join($sep, $args);
}

$level    = 2;
$unit     = 1;
$num      = 123;
$street   = 'Cool St';
$suburb   = 'Funky Town';
$state    = 'ABC';
$postcode = 2000;
$country  = 'Australia';

echo "\n" . '"' . joinargs(', ', rightOrNull('L', $level), bothOrSingle(bothOrSingle($unit, '/', $num), ' ', $street), bothOrSingle($state, ' ', $postcode), bothOrSingle($country, '', '.')) . '"';

// -> "L2, 1/123 Cool St, ABC 2000, Australia."

$level    = '';
$unit     = '';
$num      = '';
$street   = 'Cool St';
$suburb   = '';
$state    = 'ABC';
$postcode = '';
$country  = '';

echo "\n" . '"' . joinargs(
    ', ', 
    leftOrNull(
        joinargs(', ', 
            rightOrNull('L', $level), 
            bothOrSingle(bothOrSingle($unit, '/', $num), ' ', $street), 
            bothOrSingle($state, ' ', $postcode), 
            $country
        ),
        '.'
    )
) . '"';

// -> "Cool St, ABC."


$level    = '';
$unit     = '';
$num      = '';
$street   = '';
$suburb   = '';
$state    = '';
$postcode = '';
$country  = '';

echo "\n" . '"' . joinargs(
    ', ', 
    leftOrNull(
        joinargs(', ', 
            rightOrNull('L', $level), 
            bothOrSingle(bothOrSingle($unit, '/', $num), ' ', $street), 
            bothOrSingle($state, ' ', $postcode), 
            $country
        ),
        '.'
    )
) . '"';

// -> "" (even without the dot!)

?>

evet, biliyorum - biraz Brainfuck gibi görünüyor.

Philip'in çözümü (boş değerleri filtre yoksa) Dizilerle çalışırken, muhtemelen en iyi ama dizi fonksiyonlarını kullanamazsınız eğer - örneğin, sorgu sonuçları ile uğraşırken {[(0) dan döndü ]} - sonra bir çözüm deyimi ise sadece basit:

$list = '';
$row=mysqli_fetch_object($result);
do {
    $list .= (empty($list) ? $row->col : ", {$row->col}");
} while ($row=mysqli_fetch_object($result));

Veya, alternatif olarak:

do {
    if (isset($list)) {
    	$list .= ", {$row->col}";
    } else $list = $row->col;
} while ($row=mysqli_fetch_object($result));

Bir liste oluşturmak ve boş değerleri filtrelemek için, ben özel bir fonksiyon yazmak istiyorum:

function makeList() {
    $args = array_filter(func_get_args()); // as per Jon Benedicto's answer
    foreach ($args as $item) {
        if (isset($list)) {
            $list .= ", $item";
        } else {
            $list = $item;
        }
    }
    if (isset($list)) {
        return $list;
    } else return '';
}

Sonra şöyle diyebilirsin:

$unitnum = implode('/',array_filter(array($unit,$num)));
if ($unitnum || $street) {
    $streetaddress = trim("$unitnum $street");
} else $streetaddress = '';
if ($level) {
    $level = "L$level";
}
echo makeList($level, $streetaddress, $suburb, $state $postcode, $country).'.';

Ben her zaman onun hem daha hızlı ve dilin dizi yöntemleri kullanmak daha kolay. Örneğin, PHP:

<?php
echo join(',', array('L'.$level, $unit.'/'.$num, 
          $street, $suburb, $state, $postcode, $country));

Sadece son virgül çıkarmak, yani hiçbir şey ile değiştirin.

$string1 = "L$level, $unit/$num $street, $suburb, $state $postcode, $country.";
$string1 = eregi_replace(", \.$", "\.", $string1);
echo $string1;

Bu işi yapacağız.