PHP一个有或没有显式键的数组


PHP one array with and without explicit keys

我试图找出一个更好的/更干净的方式有这样的东西在PHP:

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

"姓名"answers"年龄"是带有自动键值的值(例如0和1),"邮件"是带有"some@mail.com"值的键值:

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

当在foreach循环中运行它时,我使用"Name"answers"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方法来区分具有显式通知键的元素与不在同一数组中的元素?

关于丑陋的部分你是对的。如果对所有元素都使用键,并决定键名是否使用邮件链接:

,效果会更好。
$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;
}

为什么不直接给姓名和年龄一个键呢?

或者更好的是,如果您知道params数组将始终是这种格式,则将循环全部丢弃:

echo '<p>'.$params[0].'</p>';
echo '<p>'.$params[1].'</p>';
echo '<p><a href="mailto:'.$params['Mail'].'">Mail</a></p>;
if (!is_int($k)) {
   $out .= "<p><a href='"mailto:$i'">$k</a></p>'n";
} else {
   $out .= "<p>$i<p>'n";
}

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

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"相同的方式,但第二个看起来更清楚,我觉得。