 <p>This should work for you:</p> <p>(Here i just simply go trough each innerArray with <a href="http://php.net/manual/en/control-structures.foreach.php" rel="nofollow">foreach</a>. Then i get the id from the innerArray and check if it is already in the tmp array and if not i add it to the tmp array. At the end i just simply use <a href="http://php.net/manual/en/function.array-values.php" rel="nofollow"><code>array_values()</code></a>, so that the indexes are clean and starts with 0. The <a href="http://php.net/manual/en/function.array-reverse.php" rel="nofollow"><code>array_reverse()</code></a> is to get the entire arrray in the right order)</p> <pre><code>&lt;?php $a = array( array('id'=&gt;1, 'value'=&gt;2), array('id'=&gt;2, 'value'=&gt;3), array('id'=&gt;3, 'value'=&gt;4), array('id'=&gt;1, 'value'=&gt;5), array('id'=&gt;5, 'value'=&gt;10), array('id'=&gt;2, 'value'=&gt;6), ); $tmp = array(); foreach(array_reverse($a) as $v) { $id = $v['id']; isset($tmp[$id]) or $tmp[$id] = $v; } $a = array_reverse(array_values($tmp)); print_r($a); ?&gt; </code></pre> <p>Output:</p> <pre><code>Array ( [0] =&gt; Array ( [id] =&gt; 3 [value] =&gt; 4 ) [1] =&gt; Array ( [id] =&gt; 1 [value] =&gt; 5 ) [2] =&gt; Array ( [id] =&gt; 5 [value] =&gt; 10 ) [3] =&gt; Array ( [id] =&gt; 2 [value] =&gt; 6 ) ) </code></pre>