我正在使用一些参数编写SQL查询创建器 . 在Java中,只需使用数组长度检查当前数组位置,就可以非常轻松地从for循环内部检测数组的最后一个元素 .
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
在PHP中,它们具有非整数索引来访问数组 . 因此,您必须使用foreach循环遍历数组 . 当你需要做出一些决定时(在我的情况下,在构建查询时附加或/和参数),这就成了问题 .
我相信必须有一些标准的方法来做到这一点 .
你如何用PHP解决这个问题?
30 回答
一种方法是检测迭代器是否有
next
. 如果没有下一个附加到迭代器,则意味着您处于最后一个循环中 .听起来你想要这样的东西:
话虽这么说,你没有 - 在php中使用
foreach
迭代"array" .为什么这么复杂?
这将在除最后一个之外的每个值后面添加一个!
我个人使用这种结构,可以使用html <ul>和<li>元素轻松使用:只需更改其他属性的相等性...
该数组不能包含false项,而是包含所有其他项,这些项都被转换为false boolean .
如果我了解你,那么你只需要反转数组并通过pop命令获取最后一个元素:
您可以使用
end(array_keys($array))
获取数组的最后一个键的值,并将其与当前键进行比较:简单而真实的方式
https://rricketts.com/php-tutorial-how-to-determine-the-first-and-last-iteration-in-a-foreach-loop/
您也可以尝试使用INSERT进行查询...
您仍然可以将该方法与关联数组一起使用:
因为你想要找到EOF阵列只是为了胶水 . 介绍下面的策略 . 您无需要求EOF:
O / P:
另一种方法是记住前一个循环周期结果并将其用作最终结果:
对于SQL查询生成脚本,或对第一个或最后一个元素执行不同操作的任何内容,它要快得多(几乎快两倍)以避免使用不必要的变量检查 .
当前接受的解决方案在循环内使用循环和检查every_single_iteration,正确(快速)方式执行此操作如下:
一个小的自制基准显示如下:
test1:模型morg的100000次运行
时间:1869.3430423737毫秒
test2:如果最后一次运行100000次模型
时间:3235.6359958649毫秒
这是我的解决方案:只需获得数组的计数,减去1(因为它们从0开始) .
这是你可以做到的另一种方式:
我使用了一个通用的解决方案,用于从字符串值数组中编译字符串的共同目的 . 我所做的只是在末尾添加一个不寻常的字符串,然后将其替换掉 .
Function to return a string from an array, separated, with no trailing separator:
没什么特别的,但是它有效:)
已经有很多答案,但是也值得研究迭代器,特别是因为它被要求采用标准方法:
您可能会发现某些内容对其他案例也更加灵活 .
你也可以这样做:
我有一种强烈的感觉,在这个"XY problem"的根源上,OP只需要
implode()
功能 .您可以通过以下方式直接获取最后一个索引:
$numItems = count($arr);
echo $arr[$numItems-1];
如果你需要为除第一个或最后一个元素之外的每个元素做一些事情,并且只有在数组中有多个元素时,我更喜欢以下解决方案 .
我知道上面有很多解决方案,并在我之前发布了几个月/一年,但我认为这本身就是相当优雅的 . 检查每个循环也是一个布尔检查,而不是数字“i =(count-1)”检查,这可以减少开销 .
循环的结构可能会感觉很尴尬,但您可以将它与HTML表格标签中的thead(开头),tfoot(结束),tbody(当前)的顺序进行比较 .
例如,在Web开发术语中,如果要在无序列表(ul)中添加 border-bottom to every element except the last ,则可以改为添加 border-top to every element except the first (CSS:first-child,由IE7支持,Firefox / Webkit支持此逻辑,而:IE7不支持last-child) .
您可以随意为每个嵌套循环重用$ first变量,因为每个循环在第一次迭代的第一个进程中使$ first为false,所以事情会正常工作(因此中断/异常不会导致问题) .
输出示例:
因此,如果您的数组具有唯一的数组值,那么确定上一次迭代是微不足道的:
如你所见,如果最后一个元素在数组中只出现一次,则可以正常工作,否则会出现误报 . 在它不是,你必须比较键(这是独一无二的) .
还要注意严格的coparision运算符,这在这种情况下非常重要 .
你可以做一个count() .
或者如果您只查找最后一个元素,可以使用end() .
只返回最后一个元素 .
事实证明,你可以用整数索引php数组 . 它非常满意
使用"end"怎么样? http://php.net/manual/en/function.end.php
Reference
当toEnd达到0时,表示它处于循环的最后一次迭代 .
在循环之后,最后一个值仍然可用,因此如果您只想在循环之后将其用于更多内容,则更好:
如果您不想将最后一个值视为特殊的内部循环 . 如果你有大型数组,这应该更快 . (如果在同一范围内的循环之后重用数组,则必须先“复制”该数组) .
并回答你的原始问题“在我的情况下,在构建查询时附加或/和参数”;这将遍历所有值,然后将它们连接在一起,在它们之间加上“和”,但不是在第一个值之前或最后一个值之后:
假设您将数组存储在变量中...
It sounds like you want something like this:
这应该是找到最后一个元素的简单方法:
参考:Link
我有点喜欢以下,因为我觉得它很整洁 . 假设我们在所有元素之间创建一个带分隔符的字符串:例如A,B,C