mb_convert_variables *RECURSION*

PHPのmb_convert_variables関数がうまく動かないケースがあったので記録しておく。

<?php
$a = ['あいうえお', 'かきくけこ'];
$b = [];

while ($tmp = array_shift($a)) {
    $b[0][] = $tmp;
}

mb_convert_variables('EUC-JP', 'UTF-8', $b);

header('Content-Type: text/html; charset=euc-jp');
var_dump($b);

結果(PHP7.4)

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(10) "あいうえお"
    [1]=>
    string(10) "かきくけこ"
  }
}

結果(PHP7.0)

array(1) {
  [0]=>
  *RECURSION*
}

6行目が
$b[0][] = $tmp;
でなく
$b[] = $tmp;
なら問題なく動く。
array_shiftじゃなくてmysqli_fetch_assocとかでも同じ問題が発生する。
原因はよく分からない。バージョン依存かどうかも不明。
対策としては、6行目で代入する前にmb_convert_variablesを使うようにすればいい。

関係があるかもしれない記事(外部リンク)
mb_convert_variables関数における、Cannot handle recursive references in ...のエラーについて