php中的array_walk無法unset引用數組,大家看看代碼有沒有什麼問題?

來源:互聯網
上載者:User
代碼如下:

    $array = array(0 => 'bar', 1 => 'bat', 2=>'bar', 3=>'car', 4=>'buy',5=>'foo');array_walk($array, function($val,$key) use(&$array){    if(strpos($val, 'b')!==false){        unset($array[$key]);    }});    var_dump($array);

輸出:

array(3) { [1]=> string(3) "bat" [3]=> string(3) "car" [5]=> string(3) "foo" }

回複內容:

代碼如下:

    $array = array(0 => 'bar', 1 => 'bat', 2=>'bar', 3=>'car', 4=>'buy',5=>'foo');array_walk($array, function($val,$key) use(&$array){    if(strpos($val, 'b')!==false){        unset($array[$key]);    }});    var_dump($array);

輸出:

array(3) { [1]=> string(3) "bat" [3]=> string(3) "car" [5]=> string(3) "foo" }

try php array_filter

php $array = array(0 => 'bar', 1 => 'bat', 2=>'bar', 3=>'car', 4=>'buy',5=>'foo');array_walk($array, function($val,$key) use(&$array){    echo $val."\n";    if(strpos($val, 'b')!==false){        unset($array[$key]);    }});    var_dump($array);

輸出

barbarbuyarray(3) {  [1] =>  string(3) "bat"  [3] =>  string(3) "car"  [5] =>  string(3) "foo"}

輸出這個$val就能看出端倪了。

第一次unset
變成
0 => 'bat',
1 => 'bar',
2 => 'car',
3 => 'buy',
4 => 'foo'
數組第二次遍曆,讀取索引為1的資料
所以unset($array[1]) 這時候消除的就是bar
以此類推。

一般在遍曆數組的時候去刪除數組的中的元素是非常不建議的。
會造成迭代器指向混亂。

一般的方案是把要刪除的資料放入一個新的數組裡。然後再去遍曆這個要刪除的數組 再去刪除原來的元素。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.