代码之家  ›  专栏  ›  技术社区  ›  Ross

带数组的PHP可选函数参数。如何编码/更好的编码方式?

  •  7
  • Ross  · 技术社区  · 17 年前

    我相信有更好的办法。任何帮助都将不胜感激。

    我想将数组传递给包含参数的PHP函数,并且所有参数都是可选的。我用的是代码点火器,绝对不是专家。以下是迄今为止我一直在使用的内容:

    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 = "";
        }
    
    7 回复  |  直到 17 年前
        1
  •  10
  •   Inspire    17 年前

    你可以这样做:

    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;
        }
    }
    

    只需使用您的键及其默认值编辑$fields数组。

        2
  •  27
  •   Ionuț G. Stan    12 年前

    可以使用默认值数组,然后将参数数组与默认值合并。如果默认值出现在参数数组中,则将被重写。一个简单的例子:

    $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
    )
    
    */
    

    在您的情况下,这将是:

    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'];
    }
    
        3
  •  4
  •   lukemh    12 年前

    在这种情况下,使用数组作为参数是一个好主意。但是,可以使用三元运算符稍微简化函数中的代码。( http://dk.php.net/ternary ):

    $TITLE=ISSET($PostDetailArray['TITLE'])?$postdetailarray['title']:'error:no title';

    您可以通过执行以下操作来进一步简化它:

    function addLinkPost($data) {
    
    $arguments = array('title', 'url', 'caption', 'publish', 'postdate', 'tagString');
    
    foreach ($arguments as $value) {
        $$value = isset($data[$value]) ? $data[$value] : 'Error: No '.$value;
    }
    

    }

        4
  •  0
  •   dusoft    17 年前

    我认为这个例子很好。我不认为这里有更多的优化要做,除了可能漏掉几个括号。

    或者,您可以在PHP中检查提取函数

        5
  •  0
  •   Andreas    17 年前

    试试这个:

    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
    }
    
        6
  •  0
  •   smack0007    17 年前

    您可以使函数的数组参数的所有元素。检查第一个是否是函数中的数组,如果是,则提取该数组。

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

    也许这使得代码更加清晰。

        7
  •  0
  •   cletus    17 年前

    怎么样:

    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'], '');
    }
    

    或者:

    $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;
      }
    }
    

    其中一个警告是,如果在 $defaults ,它将覆盖全局 美元违约 .