如何在索引之前添加下划线?

I want to insert underscore before the counting index every time I upload multiple files.

What I expect:

Schools.jpg

Schools_1.jpg

Schools_2.jpg

Schools_3.jpg

My program output:

Schools.jpg

Schools1.jpg

Schools2.jpg

Schools3.jpg

Here's my code:

Controller

public function do_upload() {
    $this->load->library('upload');
    $files = $_FILES;
    $cpt = count($_FILES['userfile']['name']);

    for($i=0; $i<$cpt; $i++) {
        $_FILES['userfile']['name']= $files['userfile']['name'][$i];
        $_FILES['userfile']['type']= $files['userfile']['type'][$i];
        $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
        $_FILES['userfile']['error']= $files['userfile']['error'][$i];
        $_FILES['userfile']['size']= $files['userfile']['size'][$i]; 
        $this->upload->initialize($this->set_upload_options());
        $this->db->insert('tbl_image', $file_array);
    }
}

private function set_upload_options() {
   $config = array(
        'image_library' => 'gd2',
        'file_name'     => $this->input->post('file_name'),
        'upload_path'   => './public/img/uploads',
        'upload_url'    => base_url().'public/img/uploads',
        'allowed_types' => 'jpg|jpeg|pdf',
        'max_size'      => '1024KB',
        'max_width'     => '1024',
        'max_height'    => '768',
        'maintain_ratio'=> TRUE,
        'overwrite'     => false,
    );
    return $config;
}

HTML

<label for="file">Select File To Upload:</label>
<input type="file"  name="userfile[]" multiple/>
<label for="file_name">Set image file name:</label>
<input type="text" size="20" name="file_name" required id="file_name"/>
<input type="submit" id="btnSubmit" value="Upload File"/>

I saw a lot of wrong suggested answer, they put underscore in the index of array, like this

  $_FILES['userfile']['name']= $files['userfile']['name'][$i]."_".[$i];
  //you can't do this because $file['userfile']['name'][$i] is array so better do this code


$flag=0;
            for($i=0; $i<$cpt; $i++) {
                $flag++;
                $_FILES['userfile']['name']=$files['userfile']['name'][$i];
                $_FILES['userfile']['type']= $files['userfile']['type'][$i];
                $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
                $_FILES['userfile']['error']= $files['userfile']['error'][$i];
                $_FILES['userfile']['size']= $files['userfile']['size'][$i]; 
                $this->upload->initialize($this->set_upload_options($i, $flag));
                $this->db->insert('tbl_image', $file_array);
          }


private function set_upload_options($i, $f) {
    $charac= "";
    if($f>1) {            
        $charac=$this->input->post('file_name')."_".$i;  
        //here is the code to add underscore for image 2 and above
    }
    else {
        $charac=$this->input->post('file_name');
    }
   $config = array(
        'image_library' => 'gd2',
        'file_name'     => $charac,
        'upload_path'   => './public/img/uploads',
        'upload_url'    => base_url().'public/img/uploads',
        'allowed_types' => 'gif|jpg|jpeg',
        'max_size'      => '1024KB',
        'max_width'     => '1024',
        'max_height'    => '768',
        'maintain_ratio'=> TRUE,
        'overwrite'     => false,
    );
    return $config;
}

Change this line

for($i=0; $i<$cpt; $i++) {
    $_FILES['userfile']['name']= $files['userfile']['name'][$i]."_".[$i];
    $_FILES['userfile']['type']= $files['userfile']['type'][$i];
    $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
    $_FILES['userfile']['error']= $files['userfile']['error'][$i];
    $_FILES['userfile']['size']= $files['userfile']['size'][$i]; 
    $this->upload->initialize($this->set_upload_options());
    $this->db->insert('tbl_image', $file_array);
}

change the below line from:

$_FILES['userfile']['name']= $files['userfile']['name']."_".[$i];

to

$prefix = 'Schools'; // May also use $prefix = $_POST['prefix'];
$_FILES['userfile']['name']= str_replace($prefix, "Schools_" . $i, $files['userfile']['name'][$i])

Just change first line of your loop:

// find position of the last dot, so where the extension starts
$extension_pos = strrpos($files['userfile']['name'][$i], '.'); 

// insert underscore and numbering before filetype
$newname = substr($files['userfile']['name'][$i], 0, $extension_pos) . '_' . $i . substr($filename, $extension_pos); 

// set new formated name to our file
$_FILES['userfile']['name'] = $newname;

or you may use just one line changes :

$_FILES['userfile']['name'] = preg_replace("/(\w+)\.(\w+)/","'\\1_".$i.".\\2'",  $files['userfile']['name'][$i]);

it will add underscore before filetype .

You can do it simple way by modifying upload library.Upload library adds the numbers if file exists.You can change it adding "_".
Open codeigniter folder /system/Upload.php
at line 403 replace the line $filename = str_replace($this->file_ext, '', $filename); with

$filename = str_replace($this->file_ext, '_', $filename);

If the line number is not same then search the text. Hope it will help you.