【问题标题】:Replace array value to increment替换数组值以增加
【发布时间】:2018-11-13 20:27:09
【问题描述】:

我有一个这样的数组...

[0,0,23,0,0,18,0,0]

那我想把不是'0'(23&18)的值改成自增,所以最终的结果会是这样的,

[0,0,1,0,0,2,0,0]

有没有最好的方法? 到目前为止,这就是我所做的,但结果并不像预期的那样...... :)

<?php

$arr = [0,0,23,0,0,18,0,0];
$x = 1;
$r = collect($arr)->map(function ($value, $key)use($x) {
    if ($value == 0) {
        return $value;
    } else {
        return $x++;
    }
})->all();

dd($r);

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 给我们看一些代码!
  • 如果你增加23,那不就变成24了吗?
  • 出于好奇...收集功能是什么?
  • @dnFer 我想可能是this

标签: php arrays


【解决方案1】:

问题在于,当您通过use$x 的值传递给函数时,不允许更新该值。您需要通过 reference - use (&amp;$x) 传递它以允许它在函数外增加值...

$r = collect($arr)->map(function ($value, $key) use (&$x) {

【讨论】:

    【解决方案2】:

    另一种方式...使用foreach 引用数组&amp;

    通过引用传递

    片段

    $arr = [0,0,23,0,0,18,0,0];
    $counter = 1;
    foreach ($arr as &$val){
       if($val !== 0){
          $val = $counter++;
       }
    }
    print_r($arr);
    

    注意:注意dangling reference


    无参考

    片段

    $arr = [0,0,23,0,0,18,0,0];
        $counter = 1;
        foreach ($arr as $key => $val){
           if($val !== 0){
              $arr[$key] = $counter++;
           }
        }
    print_r($arr);
    

    输出

    Array
    (
        [0] => 0
        [1] => 0
        [2] => 1
        [3] => 0
        [4] => 0
        [5] => 2
        [6] => 0
        [7] => 0
    )
    

    直播demo
    通过引用传递docs

    【讨论】:

    • $val = $counter++;$val = ++$counter; 为您节省了一行代码。 ;)
    • 当我改变你的演示时不会。
    • @dnFer 链接修改演示
    • @dnFer 谢谢,已修改。
    • @Progrock 看看foreach,通过引用传递数组,这就是直接更改数组的原因。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2014-03-09
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2018-05-22
    相关资源
    最近更新 更多