PHP一个带有和没有显式键的数组

时间:2014-07-31 13:04:32

标签: php arrays key

我正在尝试找出一种更好/更清晰的方式来在PHP中使用这样的东西:

// This will be parsed as the only argument in a function...
$params = array('Name', 'Age', 'Mail' => 'some@mail.com');

“名称”和“年龄”是带有自动键的值(例如0和1),“Mail”是带有“some@mail.com”值的键:

[0] => 'Name',
[1] => 'Age',
['Mail'] => 'some@mail.com'

在foreach循环中运行时,要将“Name”和“Age”作为实际参数,我正在使用它:

foreach ($params as $k => $i) {

    // This is the ugly part!
    if (is_int($k)) {
        $k = $i;
        $i = false;
    }

    // To do something like this, for example...
    $out = "";
    if ($i) {
        $out .= "<p><a href=\"mailto:$i\">$k</a></p>\n";
    } else {
        $out .= "<p>$k<p>\n";
    }

}

这将返回类似的内容:

<p>Name</p>
<p>Age</p>
<p><a href="mailto:some@mail.com">Mail</a></p>

有更好的方法吗?

提前致谢。

编辑#1:详细说明问题:是否有一种干净的PHP方法来区分明确通知密钥的元素与不在同一个数组中的元素?

4 个答案:

答案 0 :(得分:1)

你对丑陋的部分是正确的。当你为所有元素使用密钥时,应该更好,并决定是否不使用邮件链接的密钥名称:

$params = array('name'=>'Name', 'age'=>'Age', 'mail'=>'some@mail.com');
foreach ($params as $k => $i) {
    $out .= ($k == 'mail') ? '<a href=\"mailto:$i\">$k</a>' : $k;
}

答案 1 :(得分:0)

为什么不给名字和年龄一个关键?

或者更好的是,如果您知道params数组将始终采用这种格式,请将循环放在一起:

echo '<p>'.$params[0].'</p>';
echo '<p>'.$params[1].'</p>';
echo '<p><a href="mailto:'.$params['Mail'].'">Mail</a></p>;

答案 2 :(得分:0)

if (!is_int($k)) {
   $out .= "<p><a href=\"mailto:$i\">$k</a></p>\n";
} else {
   $out .= "<p>$i<p>\n";
}

答案 3 :(得分:0)

我找到了2个我想要的解决方案:

1 - 坚持原始方法,我可以按如下方式传递参数:

my_function(['Name', 'Age', ['Mail' => 'a@mail.com']]);

...或

my_function(array('Name', 'Age', array('Mail' => 'a@mail.com')));

稍后使用“is_array()”来区分参数的类型:

if (is_array($i)) {
    $p = current($i);
    $c = key($i);
    $out .= "<p><a href=\"mailto:$p\">$c</a></p>\n";
} else {
    $out .= "<p>$i<p>\n";
}

2 - 但是,改变我原来的范例,我找到了解析未定义数量的参数的另一个选项:函数“func_get_args()”。我的函数将被调用如下:

my_function('Name', 'Age', ['Mail' => 'a@mail.com']);

...或

my_function('Name', 'Age', array('Mail' => 'a@mail.com'));

以下是创建表格行的示例:

function add_table_row() {
    $args = func_get_args(); // returns an array of arguments...
    $o = "<tr>\n";
    foreach ($args as $value) {
        if (is_array($value)) {       // If the argument is an array...
            $cellcont = key($value);  // The contents is the key...
            $param = current($value); // And the parameter is the value...
            $o .= "<td $param>$cellcont</td>\n";
        } else {
            $o .= "<td>$value</td>\n";
        }
    }
    $o .= "</tr>\n";
    return $o;
}

最重要的是,两种解决方案都以相同的方式使用“is_array”,但第二种解决方案看起来更清晰,IMO。