csv PHP 8.1 Warning:Trying to access array offset on value of type bool in array construction [已关闭]

v6ylcynt  于 5个月前  发布在  PHP
关注(0)|答案(3)|浏览(77)

**已关闭。**此问题需要debugging details。目前不接受答案。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
上个月关门了。
Improve this question
我有一个数组的构造问题,在PHP 8.1中产生了这个错误:
警告:试图访问数组偏移类型bool值在C:\xampp\htdocs\sito3\xlsx.php行250
我删除了警告,但我想知道如何干净地删除它。
这是我的功能:

function dividi_nome_cognome(string $stringa): array 
{
    if (str_word_count($stringa, 1) === 2) {
        // only one separator " "
        return trim(explode(" ", $stringa));
    } else {
        // more than one separator
        return [
            trim(substr($stringa, 0, strrpos($stringa, " "))),
            trim(substr($stringa, strrpos($stringa, " "))),
        ];
    }
}

字符串
另一个功能:

function csvToArray($csvFile,$separatore){
    
    $file_to_read = fopen($csvFile, 'r');
    
    while (!feof($file_to_read) ) {     
        $lines[] = fgetcsv($file_to_read, 1000, $separatore);       
    }
    
    fclose($file_to_read);
    return $lines;
}


我试图从一个.csv文件中构建一个数组,

$arr_csv = csvToArray($nome_file_csv,',');
for($c=0; $c< count($arr_csv ); $c++){
                
//this line creates the warning
$nome_cognome_parts =  @divide_name_surname( ($arr_csv[$c][0] !== null) ? $arr_csv[$c][0] : "" );
$nome = $nome_cognome_parts[0];
$cognome = $nome_cognome_parts[1];
        
// build final array  
$array_finale[$c][0] = ""; 
$array_finale[$c][1] = "";
$array_finale[$c][2] = @$arr_csv[$c][2]; //this line creates the warning
$array_finale[$c][3] = @$arr_csv[$c][3]; //this line creates the warning
$array_finale[$c][4] = @$arr_csv[$c][0]; //this line creates the warning
$array_finale[$c][5] = "";
$array_finale[$c][6] = @$arr_csv[$c][1]; //this line creates the warning
$array_finale[$c][7] = "";
$array_finale[$c][8] = $nome;
$array_finale[$c][9] = $cognome;
$array_finale[$c][10] = $progressivo;
$array_finale[$c][11] = date("d-m-Y H:i:s");
$progressivo++;
}


我怎样才能在不隐藏警告的情况下解决问题?

bq9c1y66

bq9c1y661#

该代码可能试图读取文件末尾不存在的行.
按照官方文档中的示例正确读取所有行:

function csvToArray($csvFile,$separatore){
    
    $file_to_read = fopen($csvFile, 'r');
    
    while (($data = fgetcsv($file_to_read, 1000, $separatore)) !== FALSE) {
        $lines[] = $data;       
    }
    
    fclose($file_to_read);
    return $lines;
}

字符串

bvhaajcl

bvhaajcl2#

我想我通过向函数提交$js_csv解决了这个问题:

function eliminaArrayNested(array $array, int $indice1, int $indice2) {
  // Se l'indice non è valido, ritorna l'array originale
  if ($indice1 < 0 || $indice1 >= count($array) || $indice2 < 0 || $indice2 >= count($array)) {
    return $array;
  }

  // Crea un nuovo array senza gli array nested da eliminare
  $arrayNuovo = array();
  for ($n = 0; $n < count($array); $n++) {
    if ($n != $indice1 && $n != $indice2) {
      $arrayNuovo[] = $array[$n];
    }
  }

  // Restituisce il nuovo array
  return $arrayNuovo;
}

字符串

function remove_last_element_multidim_arr($array) {
    $array_length = count($array);

    if ($array_length > 0) {
        array_pop($array);
    }

    return $array;
}


新代码:

$arr_csv = csvToArray($nome_file_csv,',');
$arr_csv = eliminaArrayNested(remove_last_element_multidim_arr($arr_csv),0,1);  

for($c=0; $c< count($arr_csv ); $c++){
    nome_cognome_parts = separa_nome_cognome( 
          ($arr_csv[$c][0] !== null) ? $arr_csv[$c][0] : "" );
    $nome = $nome_cognome_parts[0];
    $cognome = $nome_cognome_parts[1];      
        
    $array_finale[$c][0] = "";
    $array_finale[$c][1] = "";
    $array_finale[$c][2] = $arr_csv[$c][2];
    $array_finale[$c][3] = $arr_csv[$c][3];
    $array_finale[$c][4] = $arr_csv[$c][0];
    $array_finale[$c][5] = "";
    $array_finale[$c][6] = $arr_csv[$c][1];
    $array_finale[$c][7] = "";
    $array_finale[$c][8] = $nome;
    $array_finale[$c][9] = $cognome;
    $array_finale[$c][10] = $progressivo; 
    $array_finale[$c][11] = date("d-m-Y H:i:s");            
    $progressivo++;
}

yvt65v4c

yvt65v4c3#

str_word_count($stringa, 1)-返回一个数组,str_word_count($stringa, 1) === 2总是返回bool(false)。要计算数组元素的数量,请使用array_count_values()

相关问题