The blender native array modifier unfortunately does not allow for different materials per array object, therefore to get the effect that you want there are only 3 ways:
Apply the array modifier and separate the resulting object by lose parts in mesh options and apply separate materials. This will obviously mean you also have to apply the curve modifier and place it where you want it first, etc
The UVProject modifier will allow you to uv project a picture to the entire object from an projector object (like an empty). In this case you would have to have one road texture that has all the variations in it already and project it using the UVProject modifier onto the array object. However this means that you cant add random variations automatically, and you have to plan the texture ahead of time to the length of the entire road object.
Use the Advanced Array Modifier build:
(I do not have an Animation Nodes build available to me for testing right now so take this with a grain of salt, but i am pretty certain that you could offset a texture/material per object segment with Animation Nodes)