93

I am creating a new array in a for loop.

for $i < $number_of_items
    $data[$i] = $some_data;

PHP keeps complaining about the offset since for each iteration I add a new index for the array, which is kind of stupid.

Notice: Undefined offset: 1 in include() (line 23 of /...
Notice: Undefined offset: 1 in include() (line 23 of /..
Notice: Undefined offset: 1 in include() (line 23 of /..

Is there some way to predefine the number items in the array so that PHP will not show this notice?

In other words, can I predefine the size of the array in a similar way to this?

$myarray = array($size_of_the_earray);
2
  • 3
    PHP shouldn't be complaining when you're assigning to those indices. Commented Mar 22, 2011 at 0:44
  • 6
    Could you provide actual code that produces the error? The code supplied is invalid. You should not get an undefined offset error from an array when setting an index value. Commented Mar 22, 2011 at 0:46

7 Answers 7

166

There is no way to create an array of a predefined size without also supplying values for the elements of that array.


The best way to initialize an array like that is array_fill. By far preferable over the various loop-and-insert solutions.

$my_array = array_fill(0, $size_of_the_array, $some_data);

Every position in the $my_array will contain $some_data.

The first zero in array_fill just indicates the index from where the array needs to be filled with the value.

Sign up to request clarification or add additional context in comments.

9 Comments

Notice: Undefined offset: 1 in include() (line 23 of / Notice: Undefined offset: 2 in include() (line 23 of / ...
@Reed: This sounds like you are trying to read from the array, while your example code looks like you 're trying to write. Which one is it?
@Reed, this is why we request the actual code being run. It makes it easier for us to provide useful, accurate answers.
@peterjwest of course, but the fact is you cannot "create an empty array with predefined size" in PHP. I'm not sure what kind of answer you expect in this situation.
Okay I do see what you mean, the wording of the question isn't ideal. A better start to the answer might be "It isn't possible have an array in PHP that has a length different to the number of values in the array. Each value must be defined before being accessed, or guarded with a an isset check"
|
25

Potentially relevant- if you want to initialize and fill an array with a range of values, use PHP's (wait for it...) range function:

$a = range(1, 5);  // array(1,2,3,4,5)
$a = range(0, 10, 2); // array(0,2,4,6,8,10)

Comments

20

You can't predefine a size of an array in php. A good way to acheive your goal is the following:

// Create a new array.
$array = array(); 

// Add an item while $i < yourWantedItemQuantity
for ($i = 0; $i < $number_of_items; $i++)
{
    array_push($array, $some_data);
    //or $array[] = $some_data; for single items.
}

Note that it is way faster to use array_fill() to fill an Array :

$array = array_fill(0,$number_of_items, $some_data);

If you want to verify if a value has been set at an index, you should use the following: array_key_exists("key", $array) or isset($array["key"])

See array_key_exists , isset and array_fill

1 Comment

Note that the shorthand $array[] = $some_data is faster than array_push() for single items
5

PHP Arrays don't need to be declared with a size.

An array in PHP is actually an ordered map

You also shouldn't get a warning/notice using code like the example you have shown. The common Notice people get is "Undefined offset" when reading from an array.

A way to counter this is to check with isset or array_key_exists, or to use a function such as:

function isset_or($array, $key, $default = NULL) {
    return isset($array[$key]) ? $array[$key] : $default;
}

So that you can avoid the repeated code.

Note: isset returns false if the element in the array is NULL, but has a performance gain over array_key_exists.

If you want to specify an array with a size for performance reasons, look at:

SplFixedArray in the Standard PHP Library.

3 Comments

I am trying to understand why is the default PHP array not optimized for performance. The manual says, it is actually an ordered map. How different is that from a hash map or hash table? The concept of a hash table is clear to me, the way it is optimized for scalability as well as random access, however, a hash map is still not clear.
It is performant, but it won't always be as performant as an array that has a specified size.
As of PHP 7, numeric ascending arrays are no longer stored as ordered maps. They're stored internally as C arrays.
5
 $array = new SplFixedArray(5);
   echo $array->getSize()."\n";

You can use PHP documentation more info check this link https://www.php.net/manual/en/splfixedarray.setsize.php

Comments

5

There is also array_pad. You can use it like this:

$data = array_pad($data,$number_of_items,0);

For initializing with zeros the $number_of_items positions of the array $data.

Comments

0

PHP provides two types of array.

  • normal array
  • SplFixedArray

normal array : This array is dynamic.

SplFixedArray : this is a standard php library which provides the ability to create array of fix size.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.