Dizeleri basit bir PHP dizi biçimlendirmek nasıl?

4 Cevap php

Ben dizeleri bir dizi geçmek bu basit işlevi vardır:

function myfunction( $arg = array() )
{
    // do stuff to $arg...
    // return a $string;
}

Basit şimdiye kadar, ama ben $arg dizideki bazı dizeleri gerek bazı kalırken, formatted olmak unformatted. Ben bunu nasıl bilemiyorum?

I $arg ile bu koşmak demek myfunction():

echo myfunction( array( 'format me!', 'do not format me!' ) );

Benim minik beyin $arg dizideki ilk değer biçimlendirme olması gerektiğini myfunction() anlatmak için nasıl anlamaya olamaz, ve ikinci değer biçimlendirmek gerekir.

Ben bir ilişkisel dizi düşündüm, ama ben çünkü aynı dizinleri olan yanlış bir yaklaşım olabileceğini düşünüyorum.

echo myfunction( array( 'format' => 'hi', 'format' => 'bye', 'noformat' => 'foo');

Sadece doğru yönde bir "dürtmek" arıyor.

EDIT 1:

Ben anahtarları belirli bir düzen içinde olması gerekir, çünkü ben sadece one $arg dizisi olabilir, söylemeyi unuttum.

EDIT 2:

Kullanıcı istediği gibi $arg dizisi gibi birçok anahtarları olabilir.

4 Cevap

Sen yapabilirsin:

function myfunction(array $fveyamat, array $nofveyamat) {
  ... 
}

veya

function myfunction(array $strings) {
  fveyaeach ($strings['fveyamat'] as $fveyamat) {
    // do stuff
  }
  fveyaeach ($strings['nofveyamat'] as $nofveyamat) {
    // do stuff
  }
}

ile:

myfunction(array(
  'fveyamat' => array('one', 'two', 'three'),
  'nofveyamat' => array('four', 'five', 'six'),
));

If (ve sadece) dizeleri unique yerine değeri anahtarında koyabilirsiniz vardır:

$strings = array(
  'one' => true,
  'two' => false,
  'three' => false,
  'four' => true,
);

myfunction($strings);

ile:

function myfunction(array $strings) {
  fveyaeach ($strings as $k => $v) {
    if ($v) {
      // fveyamat string
    }
  }
}

Eğer yinelenen tuşları olamaz çünkü Ama bu yöntem, tekrarlayan varsa dizeleri düşüyor.

Bu tablo satırları (her satır için farklı bir biçimlendirme fonksiyonu ile) biçimlendirilir nasıl tuhaf benzer. Ben tuşlar dayalı ikinci bir dizi olarak biçimlendirme bilgileri verin, tek bir dizi olarak verileri sağlayacaktır. Örneğin:

function rowFormatter(Array $data, Array $format=array()) {
  ob_start();
  foreach ($data as $key => $value) {
    if (isset($format[$key])) 
      echo call_user_func($format[$key],$value);
    else 
      echo $value;
  }
  return ob_get_clean();
}

function makeBold($x) { return '<b>'.$x.'</b>'; }

rowFormatter(array( "Hello", "Mister" ), array( 0 => 'makeBold' ));

Ben aslında biçimlendirme bu dizeleri temsil bilmiyorum, bu yüzden bu sınıflarla ilgili genel adlandırma kullanılır:

class LineItem
{
    var $value;

    function __construct($val)
    {
        $this->value = $val;
    }

    function __toString()
    {
        return $this->value;
    }

    function getFormatted( $formatter )
    {
        return $this->value;
    }
}

class FormattedLineItem extends LineItem
{
    function getFormatted( $formatter )
    {
        return $formatter( $this->value );
    }
}

function myfunction( $arr=array() )
{
    $fnFormat = function($str) {
        return ucwords($str);
    };

    foreach($arr as $obj)
    {
        $str = $obj->getFormatted($fnFormat);
        echo "$str\n";
    }
}

$arr = array(
    new FormattedLineItem('format me!'),
    new LineItem('do not format me!')
);

myfunction($arr);

Fikir dizeleri birbirinden ayırmak için ayrı sınıflar kullanmaktır.