我的一个朋友告诉我:“看看这段代码,试着在 PHP 中做到简单、简洁、清晰”。
colors = ['red', 'blue', 'green', 'yellow']
print 'Choose', ', '.join(colors[:-1]), 'or', colors[-1]
是否可以?你有任何“紧凑但可读”的 PHP 代码吗?
(顺便说一句,我在这里问它是因为这个问题不适合 codereview,也不适合 codegolf)。
我会说 PHP 版本总是不如 python 版本,因为 PHP 缺少适当的切片运算符,并且由于只有一种数组类型,您不能很好地选择使用的最后一个元素,-1
因为它实际上可能是一个有效的键。
$colors = array('red', 'blue', 'green', 'yellow');
echo 'Choose ' . implode(', ', array_slice($colors, 0, -1)) . ' or ' . end($colors);
function english_list($items, $conj) {
$tail = $conj . array_pop($items);
return implode(', ', $items) . $tail;
}
$colors = array('red', 'blue', 'green', 'yellow');
echo "Choose ", english_list($colors, " or "), "\n";
不是那么简洁,但对于不懂该语言的人来说却是可读的。也许更是如此。不是 Python 用户,我发现自己不确定是什么colors[:-1]
意思。(例如,即使我猜它是一个切片......它包括什么?)或者甚至colors[-1]
,就此而言 - 这在大多数语言中都是完全无效的,并且不会像 Python 专家认为的那样它在大多数其他人中都是如此。
另一方面,不了解 PHP(但了解 C、C++、Java、JS、Perl、Ruby ......甚至 Python)的人仍然会发现它可读。当然,他们可能不知道做什么array_pop
和implode
做什么,但他们可以很容易地找到它。尝试搜索其中任何一个;PHP 手册——专门针对各自的功能,不少!——是第一个结果。现在试试:
。:) (好吧,公平地说:“python 数组冒号运算符”。)第一个结果包含答案,但是您必须从几乎所有您对数组了解或不想了解的内容中挖掘出来。
Python以其令人难以置信的紧凑性而闻名,大多数其他语言都更加冗长。
此代码的 PHP 等效项使用更多的行/语句(请注意,这使用了 5.4 中引入的语法):
$colors = ['red', 'blue', 'green', 'yellow'];
echo 'Choose'
. implode(', ', array_slice($colors, 0, count($colors)-1))
. ' or '
. $colors[count($colors)-1];
当然 's之前的换行符.
只是为了可读性而不是必需的