Php 向一组变量添加条件格式和标点符号
我经常需要列出用逗号、空格或标点符号分隔的项目,地址就是一个典型的例子(这对于地址来说是多余的,而且是为了一个例子!): 听起来很简单,只有当变量存在时,有没有一种简单的方法“有条件地”在变量之间添加自定义分隔符?是否有必要检查是否设置了每个变量?因此,使用上述方法,另一个细节较少的地址可能会输出如下内容:Php 向一组变量添加条件格式和标点符号,php,variables,formatting,conditional,Php,Variables,Formatting,Conditional,我经常需要列出用逗号、空格或标点符号分隔的项目,地址就是一个典型的例子(这对于地址来说是多余的,而且是为了一个例子!): 听起来很简单,只有当变量存在时,有没有一种简单的方法“有条件地”在变量之间添加自定义分隔符?是否有必要检查是否设置了每个变量?因此,使用上述方法,另一个细节较少的地址可能会输出如下内容: //L, / Cool St, , ABC , . $firstItem = true; //first item shouldn't have comma for($i=0; $i=&l
//L, / Cool St, , ABC , .
$firstItem = true; //first item shouldn't have comma
for($i=0; $i=<5; $i++;){
if(!$firstItem){ echo ","; }
echo "$i";
$firstItem = false;
}
一种稍微费力的检查方法是查看是否设置了每个变量并显示标点符号
if($level){ echo "L$level, "; }
if($unit){ echo "$unit"; }
if($unit && $street){ echo "/"; }
if($street){ echo "$street, "; }
if($suburb){ echo "$suburb, "; }
//etc...
最好有一个可以自动执行所有剥离/格式化等操作的功能:
somefunction("$unit/$num $street, $suburb, $state $postcode, $country.");
另一个例子是一个简单的csv列表。我想输出以逗号分隔的x个项目:
for($i=0; $i=<5; $i++;){ echo "$i,"; }
//output: 1,2,3,4,5,
for($i=0;$i=我总是发现使用该语言的数组方法既快又容易。例如,在PHP中:
<?php
echo join(',', array('L'.$level, $unit.'/'.$num,
$street, $suburb, $state, $postcode, $country));
我总是发现使用该语言的数组方法既快又容易。例如,在PHP中:
<?php
echo join(',', array('L'.$level, $unit.'/'.$num,
$street, $suburb, $state, $postcode, $country));
虽然Phillip的回答解决了您的问题,但我想用以下博文对其进行补充。虽然他的讨论是用c#进行的,但它适用于任何编程语言。Phillip的回答解决了您的问题,我想用以下博文对其进行补充。虽然他的讨论是用c#进行的,但它适用于所有编程语言。虽然Phillip的回答解决了您的问题,但我想用以下博文对其进行补充适用于任何编程语言。第二个问题有一个简单的解决方案:
for($i=0; $i<=5; $i++)
$o .= "$i,";
echo chop($o, ',');
对于($i=0;$i第二个问题有一个简单的解决方案:
for($i=0; $i<=5; $i++)
$o .= "$i,";
echo chop($o, ',');
for($i=0;$iPhilip的解决方案在处理数组时可能是最好的(如果您不必过滤空值),但是如果您不能使用数组函数——例如,在处理从mysqli_fetch_object()
返回的查询结果时——那么一个解决方案就是一个简单的if语句:
$list = '';
$row=mysqli_fetch_object($result);
do {
$list .= (empty($list) ? $row->col : ", {$row->col}");
} while ($row=mysqli_fetch_object($result));
或者,或者:
do {
if (isset($list)) {
$list .= ", {$row->col}";
} else $list = $row->col;
} while ($row=mysqli_fetch_object($result));
要构建列表并过滤空值,我将编写一个自定义函数:
function makeList() {
$args = array_filter(func_get_args()); // as per Jon Benedicto's answer
foreach ($args as $item) {
if (isset($list)) {
$list .= ", $item";
} else {
$list = $item;
}
}
if (isset($list)) {
return $list;
} else return '';
}
那么你可以这样称呼它:
$unitnum = implode('/',array_filter(array($unit,$num)));
if ($unitnum || $street) {
$streetaddress = trim("$unitnum $street");
} else $streetaddress = '';
if ($level) {
$level = "L$level";
}
echo makeList($level, $streetaddress, $suburb, $state $postcode, $country).'.';
Philip的解决方案在处理数组时可能是最好的(如果您不必过滤空值),但是如果您不能使用数组函数——例如,在处理从mysqli\u fetch\u object()
返回的查询结果时——那么一个解决方案就是一个简单的if语句:
$list = '';
$row=mysqli_fetch_object($result);
do {
$list .= (empty($list) ? $row->col : ", {$row->col}");
} while ($row=mysqli_fetch_object($result));
或者,或者:
do {
if (isset($list)) {
$list .= ", {$row->col}";
} else $list = $row->col;
} while ($row=mysqli_fetch_object($result));
要构建列表并过滤空值,我将编写一个自定义函数:
function makeList() {
$args = array_filter(func_get_args()); // as per Jon Benedicto's answer
foreach ($args as $item) {
if (isset($list)) {
$list .= ", $item";
} else {
$list = $item;
}
}
if (isset($list)) {
return $list;
} else return '';
}
那么你可以这样称呼它:
$unitnum = implode('/',array_filter(array($unit,$num)));
if ($unitnum || $street) {
$streetaddress = trim("$unitnum $street");
} else $streetaddress = '';
if ($level) {
$level = "L$level";
}
echo makeList($level, $streetaddress, $suburb, $state $postcode, $country).'.';
对于第一个示例,您可以将数组与一些数组方法结合使用,以获得所需的结果。例如:
echo join(', ', array_filter(array("L$level", join(' ', array_filter(array(join('/', array_filter(array($unit, $num))), $street))), $suburb, join(' ', array_filter(array($state, $postcode))), $country))) . '.';
这一行代码的读取非常复杂,因此可以始终将数组、数组过滤器和连接调用包装到单独的方法中,并使用该方法:
function merge($delimiter)
{
$args = func_get_args();
array_shift($args);
return join($delimiter, array_filter($args));
}
echo merge(', ', "L$level", merge(' ', merge('/', $unit, $num), $street), $suburb, merge(' ', $state, $postcode), $country) . '.';
您需要使用array_filter调用来删除空条目,否则delimeters仍然会被打印出来
对于第二个示例,将项目添加到数组中,然后使用join插入delimeter:
$arr = array();
for($i=0; $i=<5; $i++)
{
$arr[] = $i;
}
echo(join(',', $arr));
$arr=array();
对于第一个示例($i=0;$i=),可以将数组与一些数组方法结合使用以获得所需的结果。例如:
echo join(', ', array_filter(array("L$level", join(' ', array_filter(array(join('/', array_filter(array($unit, $num))), $street))), $suburb, join(' ', array_filter(array($state, $postcode))), $country))) . '.';
这一行代码的读取非常复杂,因此可以始终将数组、数组过滤器和连接调用包装到单独的方法中,并使用该方法:
function merge($delimiter)
{
$args = func_get_args();
array_shift($args);
return join($delimiter, array_filter($args));
}
echo merge(', ', "L$level", merge(' ', merge('/', $unit, $num), $street), $suburb, merge(' ', $state, $postcode), $country) . '.';
您需要使用array_filter调用来删除空条目,否则delimeters仍然会被打印出来
对于第二个示例,将项目添加到数组中,然后使用join插入delimeter:
$arr = array();
for($i=0; $i=<5; $i++)
{
$arr[] = $i;
}
echo(join(',', $arr));
$arr=array();
对于($i=0;$i=),只需去掉最后一个逗号,即将其替换为零
$string1 = "L$level, $unit/$num $street, $suburb, $state $postcode, $country.";
$string1 = eregi_replace(", \.$", "\.", $string1);
echo $string1;
这样就可以了。只需去掉最后一个逗号,也就是说,将其替换为零
$string1 = "L$level, $unit/$num $street, $suburb, $state $postcode, $country.";
$string1 = eregi_replace(", \.$", "\.", $string1);
echo $string1;
这就行了。好的,拿着它!(但不要太严肃^)
是的,我知道-看起来有点像脑力操。好吧,拿着它!(但不太严重^^)
是的,我知道-看起来有点像脑力操。除非在添加每个元素之前检查isset或empty,否则无法解决问题。就像我所做的那样(见下文,第3页)。不幸的是,这让它变得不那么优雅。除非在添加每个元素之前检查isset或empty,否则无法解决问题。就像我所做的(见下文,第3页).不幸的是,这让它变得不那么优雅了。如果我不得不维护你的代码,我宁愿看到像“艰巨”这样的东西方法。单行解决方案很难看。我同意单行可能很难阅读,因此我添加了另一个示例,将数组、数组过滤器和连接调用重构为帮助器方法。如果我必须维护您的代码,我更希望看到类似“艰巨”的内容方法。这一行解决方案很难看。我同意一行可能很难阅读,因此我添加了另一个示例,将数组、数组过滤器和连接调用重构为帮助器方法。虽然这些解决方案有效,但对于看似简单的输出来说,这似乎是一些冗长的代码……对于更复杂的排列,它需要如果你想了解这些选项,那就更麻烦了……谢谢你的贡献!imho#3没有那么糟糕。在我的例子中,它看起来比实际情况更糟糕,因为我涵盖了单位/数量组合的每个选项。如果有空值(没有“foo,,bar”),它会正确显示。有些人不喜欢(有时很差)结构的可读性,很难。虽然这些解决方案可行,但对于一个看似简单的输出来说,它似乎是一些冗长的代码……对于一个更复杂的安排来说,让您的头脑围绕这些选项会更加复杂……感谢您的贡献!imho#3并没有那么糟糕。在我的示例中,它看起来比实际情况更糟,因为我涵盖了eve单位/num组合的ry选项。如果有空值(没有“foo,,bar”),它会正确显示。有些人不喜欢?构造的可读性(有时很差),很难。我想这已经接近街道地址了