2009-09-25 10 views
7

Jestem pewien, że jest lepiej. Każda pomoc zostanie bardzo doceniona.PHP opcjonalne argumenty funkcji z tablicą. Jak kodować/Lepszy sposób kodowania?

Chcę przekazać tablicę do funkcji php zawierającej argument, a wszystkie argumenty są opcjonalne. Używam inicjatora kodu i nie jestem ekspertem. Poniżej jest to, czego używam do tej pory:

function addLinkPost($postDetailArray) { 

    if (isset($postDetailArray['title'])) { 
     $title = $postDetailArray['title']; } 
    else { 
     $title = "Error: No Title"; 
    } 

    if (isset($postDetailArray['url'])) { 
     $url  = $postDetailArray['url']; 
    } else { 
     $url  = "no url"; 
    } 
    if (isset($postDetailArray['caption'])) { 
     $caption = $postDetailArray['caption']; 
    } else { 
     $caption = ""; 
    } 
    if (isset($postDetailArray['publish'])) { 
     $publish = $postDetailArray['publish']; 
    } else { 
     $publish = TRUE; 
    } 
    if (isset($postDetailArray['postdate'])) { 
     $postdate = $postDetailArray['postdate']; 
    } else { 
     $postdate = "NOW()"; 
    } 
    if (isset($postDetailArray['tagString'])) { 
     $tagString = $postDetailArray['tagString']; 
    } else { 
     $tagString = ""; 
    } 

Odpowiedz

10

Można to zrobić tak:

function addLinkPost(array $postDetailArray) 
{ 
    $fields = array(
     'key' => 'default value', 
     'title' => 'Error: No Title', 
    ); 

    foreach ($fields as $key => $default) { 
     $$key = isset($postDetailArray[$key]) ? $postDetailArray[$key] : $default; 
    } 
} 

prostu edytować tablicę $ pól z klucza i jego wartości domyślnej.

+0

Powinieneś być ostrożny przy robieniu takich rzeczy, szczególnie jeśli dane są dostarczane przez użytkowników, ponieważ są podobne do register_globals. –

+0

@Tom Chociaż osobiście zaimplementowałbym to używając tablicy do przechowywania wartości w przeciwieństwie do funkcji zmiennej lokalnej, której używał w swoim pytaniu i użyłem w mojej odpowiedzi, możesz zaimplementować szybkie sprawdzenie w pętli foreach, aby zignorować jakiekolwiek dostarczone klucze, które nie znajdują się w tablicy $ fields – Inspire

+0

Właściwie w drugiej chwili mój przykład iteruje nad tablicą $ fields w przeciwieństwie do $ postDetailArray, więc sprawdzenie klucza nie będzie konieczne. – Inspire

0

Myślę, że przykład jest w porządku. nie sądzę, że można tu zrobić o wiele więcej optymalizacji, chyba że pominiemy kilka nawiasów.

Opcjonalnie można sprawdzić działanie ekstraktu w PHP

0

Jak o:

function getdefault($value, $default = null) { 
    return isset($value) ? $value : $default; 
} 

function addLinkPost($postDetailArray) { 
    $title = getdefault($postDetailArray['title'], 'Error: No Title'); 
    $url = getdefault($postDetailArray['url'], 'no url'); 
    $caption = getdefault($postDetailArray['caption'], ''); 
    $publish = getdefault($postDetailArray['publish'], TRUE); 
    $postdate = getdefault($postDetailArray['postdate'], 'NOW()'); 
    $tagString = getdefault($postDetailArray['tagString'], ''); 
} 

lub alternatywnie:

$defaults = array(
    'title' => 'Error: No Title', 
    'url' => 'no url', 
    'caption' => '', 
    'publish' => TRUE, 
    'postdate' => 'NOW()', 
    'tagString' => '', 
); 

function addLinkPost($postDetailArray) { 
    global $defaults; 
    foreach ($defaults as $k => $v) { 
    $$k = isset($postDetailArray[$k]) ? $postDetailArray[$k] : $v; 
    } 
} 

z jednym ostrzeżeniem, że jeśli masz klucza tablicy " domyślne "w $defaults, nadpisze globalny $defaults.

+0

że ('$ postDetailArray [ 'title']') wyda w ogłoszeniu. –

4

Używanie tablicy jako argumentu jest dobrym pomysłem w tym przypadku. Można jednak nieco uprościć kod funkcji za pomocą operatora trójskładnikowego (http://dk.php.net/ternary):

$ title = isset ($ postDetailArray ['title'])? $ postDetailArray ['title']: 'Error: No Title';

Mogłeś uprościć jeszcze bardziej, wykonując następujące czynności:

function addLinkPost($data) { 

$arguments = array('title', 'url', 'caption', 'publish', 'postdate', 'tagString'); 

foreach ($arguments as $value) { 
    $$value = isset($data[$value]) ? $data[$value] : 'Error: No '.$value; 
} 

}

+0

Po prostu zauważyłem, że nie powinien to być "Błąd: Nie ..." dla wszystkich opcji, ale nadal ... Masz pomysł. – Jonas

0

Spróbuj tego:

function addLinkPost($postDetailArray) { 

    foreach($array as $key=>$value){ 
    $$key = (isset($value) && !empty($value)) ? $value : ('no '.$key); 
    } 
    //all keys are available as variables 
    var_dump($url); var_dump($publish); //etc 
} 
0

Można zrobić wszystkie elementy parametrów wachlarz funkcji. Sprawdź, czy pierwsza jest tablicą w funkcji, a jeśli tak, wyodrębnij tablicę.

function addLinkPost($title = null, $url = null, $caption = null, $publish = null, $postDate = null, $tagString = null) 
{ 
     if(is_array($title)) { 
      extract($title); 
     } 

     .... 
} 

Może to sprawia, że ​​kod jest trochę bardziej przejrzysty.

27

Można użyć tablicy wartości domyślnych, a następnie scalić tablicę argumentów z wartościami domyślnymi. Wartości domyślne zostaną nadpisane, jeśli pojawią się w tablicy argumentów. Prosty przykład:

$defaults = array(
    'foo' => 'aaa', 
    'bar' => 'bbb', 
    'baz' => 'ccc', 
); 

$options = array(
    'foo' => 'ddd', 
); 


$merged = array_merge($defaults, $options); 

print_r($merged); 

/* 

Array 
(
    [foo] => ddd 
    [bar] => bbb 
    [baz] => ccc 
) 

*/ 

W twoim przypadku, to byłoby:

function addLinkPost($postDetailArray) { 
    static $defaults = array(
     'title'  => 'Error: No Title', 
     'url'  => 'no url', 
     'caption' => '', 
     'publish' => true, 
     'postdate' => 'NOW()', 
     'tagString' => '', 
    ); 

    $merged = array_merge($defaults, $postDetailArray); 

    $title  = $merged['title']; 
    $url  = $merged['url']; 
    $caption = $merged['caption']; 
    $publish = $merged['publish']; 
    $postdate = $merged['postdate']; 
    $tagString = $merged['$tagString']; 
} 
+0

To jest sposób, aby to zrobić. Otrzymasz pożądany wynik i otrzymasz bardzo czytelne podsumowanie tego, jakie są wartości domyślne. Zasadniczo pozwala to PHP robić to zamiast pętli, ty sam. PHP zapewnia tak wiele wspaniałych funkcji tablicowych, że nienawidzę pętli nad tablicą - za każdym razem, gdy widzę pętlę w tablicy, wyczuwam coś, co prawdopodobnie można zastąpić natywnymi funkcjami tablicowymi. – grantwparks

+0

Zgadzam się - jest to zdecydowanie najbardziej czytelny sposób na zrobienie tego. Mniej LOC nie zawsze jest lepsze. – calumbrodie

+0

Elegancki! Zauważ jednak, że użycie osobnej "scalonej" tablicy nie jest bezwzględnie konieczne. Dodaję następujące elementy jako ulepszenie do mojego istniejącego kodu: $ argsR = array_merge ($ defaultsR, $ argsR; ($ argsR jest istniejącą tablicą argumentów funkcji przekazywaną i przetwarzaną przez istniejącą funkcję). –