foreach item php_php foreach($data as &$item)踩的坑

在php项目开发中,经常用到foreach 进行对数组数据的循环,尤其是使用传&$item,这样的引用类使用;

在php里,

数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

而在foreach的实现里,每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步。

当我们在第一个foreach中以引用的方式使用元素,循环结束之后,$v 其实是数组最后一个元素的引用。

由于foreach不销毁最后一个元素,所以当第一个循环结束时,我们有了一个隐藏的变量v,它是指向数组v,它是指向数组arr 最后一个元素的引用。

示例:

$arr = [

'0' => [

'id' => 1,

'name' => '这是1',

'child' => [

'0' => [

'child_id' => 100,

'child_name' => '这是 100 name',

'child' =>[

'0' => [

'child_id' => 1001,

'child_name' => '这是 1001 name',

],

'1' => [

'child_id' => 1002,

'child_name' => '这是 1002 name',

],

],

],

'1' => [

'child_id' => 102,

'child_name' => '这是 102 name',

],

'2' => [

'child_id' => 103,

'child_name' => '这是 103 name',

],

],

],

'1' => [

'id' => 2,

'name' => '这是2',

'child' => [

'0' => [

'child_id' => 201,

'child_name' => '这是 201 name',

],

'1' => [

'child_id' => 202,

'child_name' => '这是 202 name',

],

'2' => [

'child_id' => 203,

'child_name' => '这是 203 name',

],

],

],

];

$result = [];

foreach($arr as $key=>$row){

foreach($row['child'] as $key=>&$item){

if(isset($item['child']) && !empty($item['child'])){

$result1 = [];

foreach($item['child'] as $item){

$result1[] = $item;

}

}

$item['child_name'] = $item['child_name'].'-'.rand(1,2);

}

$result[] = $row;

}

YxUtil::sys_debug($result);

有时候在处理一下比较大的数据遍历的时候,各种情况下可能会存在一些嵌套循环,foreach的key或value变量命名重复的情况,建议使用前unset掉,包括用完的变量也要及时释放掉。

近期就是遇到了这个问题,在一堆房源数据中,循环格式化数据,发生了房型错误归属的问题,终究是自己代码写的有问题,给自己挖了个坑。

建议还是养成良好的习惯,命名、书写及变量释放等。

此外推荐个替代函数array_map 及闭包的使用。

打赏

ff7332c9d8833ec3435fe3dc38de7de3.png

d954b0e6ab9d313a5e1b698d19023135.png微信扫一扫,打赏作者吧~

如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。

支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!

喜欢 (0)or分享 (0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逐行解释这段代码:$(".add-to-cart-btn").click(function() { var itemId = $(this).data("id"); var itemName = $(this).data("name"); var itemPrice = $(this).data("price"); $.ajax({ type: "POST", url: "add-to-cart.php", data: { id: itemId, name: itemName, price: itemPrice } }).done(function(response) { alert(response); }); }); session_start(); $itemId = $_POST["id"]; $itemName = $_POST["name"]; $itemPrice = $_POST["price"]; if (!isset($_SESSION["cart"])) { $_SESSION["cart"] = array(); } array_push($_SESSION["cart"], array("id", $itemId, "name", $itemName, "price", $itemPrice)); echo "添加商品成功!"; $(document).on("click", ".remove-item-btn", function() { var itemId = $(this).data("id"); $.ajax({ type: "POST", url: "remove-from-cart.php", data: { id: itemId } }).done(function(response) { location.reload(); }); }); session_start(); $itemId = $_POST["id"]; foreach ($_SESSION["cart"] as $key => $item) { if ($item["id"] == $itemId) { unset($_SESSION["cart"][$key]); } } echo "删除商品成功!"; $(".checkout-btn").click(function() { var selectedItems = $(".cart-item:checked"); var totalPrice = 0; selectedItems.each(function() { var itemPrice = $(this).parents(".cart-item-row").find(".item-price").text(); var itemQty = $(this).parents(".cart-item-row").find(".item-qty").val(); var subTotal = itemPrice * itemQty; totalPrice += subTotal; }); window.location.href = "checkout.php?id=" + selectedItems.serialize() + "&total=" + totalPrice; }); session_start(); $selectedIds = explode("&", $_GET["id"]); foreach ($selectedIds as $key => $value) { $selectedIds[$key] = substr($value, strpos($value, "=") + 1); } $totalPrice = $_GET["total"];
最新发布
06-07

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值