gitguddoge
gitguddoge

Reputation: 172

Which ways to clear array is better in this situation?

I intend to create a multidimensional array through a loop. My idea is that inside the loop function, I would assign elements into a single array, then the single array would assign into another big array before i empty the single array for the next loop process.

E.g.

for($i=0;$i<5;$i++){
   $arr1['a'] = $i;
   $arr1['b'] = $i+=2;
   $arr2[] = $arr;  //assign the arr1 into the arr2
   $arr1= []; //clear arr1 again for the next looping
}
var_dump($arr2);

And the the result would be:

array (size=2)
  0 => 
    array (size=2)
      'a' => int 0
      'b' => int 2
  1 => 
    array (size=2)
      'a' => int 3
      'b' => int 5

However I find out that there are actually quite many ways to empty an array and Im not sure about that the way I empty the array is better/more efficient than the other ways such as unset or reinitialize the array like $arr1 = array()in this case. I look through online but there are not much in comparing these ways. Any suggestion to improve the performance on this or this is just as good as other ways? By looking at these:

unset($arr)
$arr = array()
$arr = []

And perhaps other ways?

Upvotes: 0

Views: 54

Answers (2)

alariva
alariva

Reputation: 2139

If you want to execute a comparison, yo can do it with help of this code.

Ref: https://gist.github.com/blongden/2352583

It would look like so:

<?php

$calibration = benchmark(function() {

    for($i=0;$i<5;$i++){
          $arr2[$i]['a'] = $i;
          $arr2[$i]['b'] = $i+2;
        }

});

$benchmark = benchmark(function(){

    for($i=0;$i<5;$i++){
       $arr1['a'] = $i;
       $arr1['b'] = $i+=2;
       $arr2[] = $arr1;
       $arr1 = [];
    }

});

echo "Calibration run: ".number_format($calibration)."/sec\n";
echo "Benchmark run: ".number_format($benchmark)."/sec\n";
echo 'Approximate code execution time (seconds): '.number_format((1/$benchmark) - (1/$calibration), 10);

function benchmark($x)
{
    $start = $t = microtime(true);
    $total = $c = $loop = 0;
    while (true) {
        $x();
        $c++;
        $now = microtime(true);
        if ($now - $t > 1) {
            $loop++;
            $total += $c;
            list($t, $c) = array(microtime(true), 0);
        }
        if ($now - $start > 2) {
            return round($total / $loop);
        }
    }
}

Output for a test run in my env (PHP 7.2.8-1+ubuntu16.04.1+deb.sury.org+1)

Calibration run: 258,534/sec
Benchmark run: 259,401/sec
Approximate code execution time (seconds): -0.0000000129

You will see that the given function by Nikhil is actually faster.

Output for the following function being run:

for($i=0;$i<5;$i++){
      $arr2[$i]['a'] = $i;
      $arr2[$i]['b'] = $i+2;
    }

Calibration run: 209,614/sec
Benchmark run: 209,773/sec
Approximate code execution time (seconds): -0.0000000036

Feel free to play around your own tests

Upvotes: 1

Nikhil Thakur
Nikhil Thakur

Reputation: 343

Instead of making one extra array (smaller array) and then assigning the value to the bigger array, you can do something like this:

for($i=0;$i<5;$i++){
      $arr2[$i]['a'] = $i;
      $arr2[$i]['b'] = $i+2;
    }
var_dump($arr2);

Output:

array (size=2)
  0 => 
    array (size=2)
      'a' => int 0
      'b' => int 2
  1 => 
    array (size=2)
      'a' => int 3
      'b' => int 5

In this case, you will not need to empty the (smaller) array again and again. Also it will save your memory space as you are using just one array.

Upvotes: 1

Related Questions