我正在尝试找出一种更好/更清晰的方式来在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方法来区分明确通知密钥的元素与不在同一个数组中的元素?
答案 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。