jimbeeer
jimbeeer

Reputation: 1695

renaming files in an array incrementally

I've got a folder full of files pulled into an array:

Array
(
    [2] => 2_1_page2-img5.jpg
    [3] => 2_2_page2-img5-big.jpg
    [4] => 3_1_page2-img6.jpg
    [5] => 3_2_page2-img6-big.jpg
    [6] => 4_1_page2-img3.jpg
    [7] => 4_2_page2-img3-big.jpg
    [8] => 6_2_page2-img3-big.jpg
    [9] => 8_2_page2-img3-big.jpg
)

I'm trying to create a script that will rename them all so they start at 1 and rename incrementally. The ideal solution would be:

Array
(
    [2] => 1_1_page2-img5.jpg
    [3] => 1_2_page2-img5-big.jpg
    [4] => 2_1_page2-img6.jpg
    [5] => 2_2_page2-img6-big.jpg
    [6] => 3_1_page2-img3.jpg
    [7] => 3_2_page2-img3-big.jpg
    [8] => 4_2_page2-img3-big.jpg
    [9] => 5_2_page2-img3-big.jpg
)

I won't know whether each number will have one or two images attached to it.

So far I've got:

    $filecounter = 1;
    $previousNumber = $filecounter;
    foreach($listing as $imagename){
        // $imagename: the original filename
        // $prefixNumber: the first number from the filename
        // $reducedfilename: the filename without the prefix
        // $previousNumber: the previous number
        // $filecounter: the count up from 1

        $prefixNumber = stristr($imagename, '_',true);
        $reducedfilename = ltrim(stristr($imagename, '_'), '_');



        if ($prefixNumber != $filecounter && $prefixNumber != $previousNumber){
            $previousNumber = $filecounter;
            $filecounter++;
            echo "filecounter: $filecounter<br>prefixNumber: $prefixNumber<br>previousNumber: $previousNumber<br>";
            echo "1. Renaming: " .$imagename . " to  " . $filecounter . "_" . $reducedfilename . "<br><br>";
            //rename($directory . $imagename, $directory . $filecounter. "_" . $reducedfilename);

        } else {
            echo "filecounter: $filecounter<br>prefixNumber: $prefixNumber<br>previousNumber: $previousNumber<br>";
            echo "2. Renaming: " .$imagename . " to  " . $previousNumber . "_" . $reducedfilename . "<br><br>";
            //rename($directory . $imagename, $directory . $previousNumber . "_" . $reducedfilename);
        }

I've given myself a ton of visual pointers to try and help but I think I've been staring at it too long and I honestly can't work it out.

Does anyone please have any ideas what I'm doing wrong here?

Upvotes: 0

Views: 77

Answers (1)

Jacob
Jacob

Reputation: 920

I think something like this should probably work for you.

$filecounter = 1;
$currentPrefix = false;
$lastPrefix = false;
foreach ($listing as $imagename) {
    $aFileParts = explode('_', $imagename);
    $currentPrefix = $aFileParts[0];

    if (!$lastPrefix) {
        $lastPrefix = $currentPrefix;
    }

    if ($currentPrefix != $lastPrefix) {
        $filecounter++;
        $lastPrefix = $currentPrefix;
    }

    $newFileName = $filecounter . '_' . $aFileParts[1] . '_' . $aFileParts[2];
}

Upvotes: 1

Related Questions