In this snippet I have a function (FDiskScan) that gets a computer name as an input and should return an array of objects.
function FDiskScan ([String] $name)
{
    $outarray = [System.Collections.ArrayList]@()
    $diskscan = Get-WmiObject Win32_logicaldisk -ComputerName $name
    foreach ($diskobj in $diskscan)
    {
        if($diskobj.VolumeName -ne $null ) 
        {
            $max = $diskobj.Size/1024/1024/1024
            $free = $diskobj.FreeSpace/1024/1024/1024
            $full = $max - $free
            $obj = @{ 
                'ID' = $diskobj.deviceid
                'Name' = $diskobj.VolumeName
                'TotalSpace' = $max
                'FreeSpace' = $free
                'OccupiedSpace' = $full }
            $TMP = New-Object psobject -Property $obj
            $outarray.Add($TMP) 
        }
    }
    return $outarray
}
$pc = "INSERT PC NAME HERE"
$diskdata = [System.Collections.ArrayList]@()
$diskdata = FDiskScan($pc)
foreach ($disk in $diskdata) 
{
   Write-Host "Disco: " $disk.ID
   Write-Host "Espaço Total: " ([math]::Round($disk.TotalSpace, 2)) "GB"
   Write-Host "Espaço Ocupado: " ([math]::Round($disk.OccupiedSpace, 2)) "GB"
   Write-Host "Espaço Livre"  ([math]::Round($disk.FreeSpace, 2)) "GB" "`n"
}
Within the function with debugging and going into the variables I can see that everything is alright, and when the array gets out of the function and into the script scope it adds 2 more entries.
While in debug mode it tells me that $outarry within FDiskScan has the two disks that I have on my system organised as they should be.
However on:
$diskdata = FDiskScan($pc)
It says that it has an entry of value 0 on index 0 and of value 1 on index 1, then the disks follow suit, first disk C: in index 3 and disk D in index 4.
The expected behaviour was for index 0 and 1 having disks C and D respectively not a phantom 0 and 1 entries.
 
     
    