Ludwig
Ludwig

Reputation: 1801

Fill up array with missing elements

I have an array which looks like this:

array:6 [▼
    0 => 2
    1 => 2
    2 => 2
    6 => 5
    10 => 3
    11 => 1
]

I would like to check for a range of numbers e.g. 0 to 11 if these keys exist in my array. If not I want to create the element with the missing key and give it the value 0.

So I would end up with an array like this:

array:6 [▼
   0 => 2
   1 => 2
   2 => 2
   3 => 0
   4 => 0
   5 => 0
   6 => 5
   7 => 0
   8 => 0
   9 => 0
   10 => 3
   11 => 1
]

I tried something like this:

$range = range(0,11);

foreach($myArray as $key => $value){
  if(!in_array($key, $range)){
    $myArray[$key] = 0;
  }
}

But I just get the same array as at the beginning of the question.

Upvotes: 1

Views: 1960

Answers (5)

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

The solution using array_diff_key and array_fill functions:

// $arr is your initial array
$diff = array_diff_key(array_fill(0,12,0), $arr);
$result = $arr + $diff;
ksort($result);

print_r($result);

The output:

Array
(
    [0] => 2
    [1] => 2
    [2] => 2
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 5
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 3
    [11] => 1
)

Upvotes: 0

Murad Hasan
Murad Hasan

Reputation: 9583

You need to browse the whole array for set missing keys value 0. I make a function for doing this, Check if the index is missing then set 0.

$array = array('0' => 2, '1' => 2, '2' => 2, '6' => 5, '10' => 3, '11' => 1);
function cleanArray(&$array){
    end($array);
    $max = key($array); //Get the final key as max!
    for($i = 0; $i < $max; $i++){
        if(!isset($array[$i])){
            $array[$i] = 0;
        }
    }
}

cleanArray($array);
ksort($array);
print_r($array);

Upvotes: -1

Rizier123
Rizier123

Reputation: 59681

You can create an array with array_fill_keys() and pass it the amount of keys you want with range() and fill the array with 0's. After that you can replace all elements which you already have in your array with array_replace().

<?php

    $array = [2 => 3, 5 => 2, 11 => 7];

    $result = array_replace(array_fill_keys(range(0, 11), 0), $array);
    print_r($result);

?>

The problem with your code is that you only loop over the elements of your array. So if you have just 3 elements you will just loop over these 3 elements.

If you want to fix your current code you would have to loop over the $range and then check if the key, not the value, exists in your array and if yes use the value from it otherwise create the element with the value 0.

Fixed code:

$range = range(0,11);
$result = [];

foreach($range as $key){
    if(isset($array[$key]))
        $result[$key] = $array[$key];
    else
        $result[$key] = 0;
}

Upvotes: 7

RJParikh
RJParikh

Reputation: 4166

Use below code.

1) Using key() we find last key number.

2) Using array_key_exists(key,array) check for key exist in array or not.

3) Fill it in new array.

$arr = array(
    0 => 2,
    1 => 2,
    2 => 2,
    6 => 5,
    10 => 3,
    11 => 1,
   );
end($arr);
$endKey = key($arr);

for($i=0;$i<$endKey;$i++)
{
    if(!array_key_exists($i, $arr))
    {
        $newarr[$i] = 0;
    }
    else
    {
        $newarr[$i] = $arr[$i];
    }
}

Output

Array
(
    [0] => 2
    [1] => 2
    [2] => 2
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 5
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 3
)

Upvotes: 0

Parth Panchal
Parth Panchal

Reputation: 131

You can try following code if you have range of array key upto 11 only.

for($i=0; $i<=11;$i++){
    if(!array_key_exists($i,$array)){
      $array[$i] = 0;
    }
}

Upvotes: 1

Related Questions