Search code examples
phparrayscsvnumeric

PHP - Calculate Array with Non Numeric Value


From mycsv.csv
$data[7] has these:

4294967296/4294967296  
4294967296  
8589934592/8589934592  

I want to calculate and put GB, so they become like this:

4GB/4GB  
4GB  
8GB/8GB

What I did:

<?php

$a = str_ireplace("/"," ",$data[7]);  
echo (floor($a/1000000000))."GB";

But it gives error for the ones that have /:

Warning: A non-numeric value encountered in... on line 45 4GB

...

Help Please... Thank you


Sorry, I think I describe it wrong.
So, I have a csv file with many data in it.

while (! feof($CSVvar)) {
        $data = fgetcsv($CSVvar, 1000, ",");
        if (! empty($data)) {
            ?>
            <tr>
                <td><?php echo $data[0]; ?></td>
                <td><?php echo $data[7]; ?></td></tr>

will give among others:

$data[7]

4294967296/4294967296

then another

$data[7]

4294967296

and so on..


Solution

  • You can't floor a string like 4294967296 4294967296 after you do the str_ireplace. You will need a bit of looping for this but I have tried to make it as short as possible for you keeping it readable(hopefully).

    So, split the string based on new lines so you would get each string in a separate array index.

    Now, for each string of the form x/y or x itself, we split the string based on /. Now, we divide each number in the array by 1e9 to convert bytes to Giga bytes and implode them back with a GB suffix attached to it.

    Finally, we collect these results in a new array and implode them back using a new line character.

    <?php
    
    $result = [];
    
    foreach(explode("\n", $data[7]) as $str){
        $result[] = implode("GB/", array_map(fn($v) => floor($v / 1e9), explode("/", $str))). 'GB';
    }
    
    echo implode("\n", $result);
    

    Live Demo