web-dev-qa-db-ja.com

PHP 7.2非推奨:while = each()ループは$ valueなしで

each()ループはPHP 7.2から非推奨になっているため、以下を更新する方法while(( each()))== $ valueなしのループ?

$ valueがなければ、foreachループが機能しません。さらにwhile($ products_id = $ this-> contents)は無限ループになります。

ありがとうございました!

function count_contents() {  // get total number of items in cart 
  $total_items = 0;
  if (is_array($this->contents)) {
    reset($this->contents);
    while (list($products_id, ) = each($this->contents)) {
      $total_items += $this->get_quantity($products_id);
    }
  }
  return $total_items;
}
function get_quantity($products_id) {
  if (isset($this->contents[$products_id])) {
    return $this->contents[$products_id]['qty'];
  } else {
    return 0;
  }
}
9
Petro Mäntylä

私はそれを修正する方法を見つけ、情報を共有しようと考えました。また、each()ループをforeach()にアップグレードする方法に関する他のケースもあります。

ケース1:欠落$ value

reset($array);
while (list($key, ) = each($array)) {

更新先:

foreach(array_keys($array) as $key) {

ケース2:欠落$ key

reset($array);
while (list(, $value) = each($array)) {

更新先:

foreach($array as $value) {

ケース3:何も欠落していない

reset($array);
while (list($key, $value) = each($array)) {

更新先:

foreach($array as $key => $value) {
26
Petro Mäntylä

以下にいくつかの方法を示します。

標準のforeachループ(非常に読みやすい):

_foreach($this->contents as list($products_id)) {
    $total_items += $this->get_quantity($products_id);
}
_

または、削減:

_$total_items = array_reduce($this->contents, function($acc, $item) {
    return $acc + $this->get_quantity($products_id[0]);
});
_

または、関数式で:

_$total_items = array_sum(array_map([$this, 'get_quantity'],
                         array_column($this->contents, 0)));
_

これらのメソッドのいずれも、その前にreset($this->contents);を必要としません。

2
trincot

PetroMäntyläの優れた正解を展開するには、ケース3

ここに、「ケース3」の状況の完全な例を示します。完全な例は、1行のコードが断片化するよりもはるかに有益だからです。

これは、サードパーティの古いコードベース(TCPDF)からの本物のコードです

非推奨:

while (list($id, $name) = each($attr_array)) {
      $dom[$key]['attribute'][$name] = $attr_array[$id];
      ...              
      ...             
   }

修繕:

 // while (list($id, $name) = each($attr_array)) {
 foreach($attr_array as $feKey => $feRow){
    // $dom[$key]['attribute'][$name] = $attr_array[$id];
    $dom[$key]['attribute'][$feRow] = $attr_array[$feKey];
    ...
    ...
    }
 unset($feKey,$feRow);
1
Martin