Preg_match_all into a simple array

I have a preg_match_all function:

preg_match_all('#<h2>(.*?)</h2>#is', $source, $output, PREG_SET_ORDER); 

It works as intended, but the problem is that it first drags all the elements twice and into a huge multidimensional array, like this, for example, where it, as expected, preg_matched all 11 elements, but twice into a multidimensional array:

 Array ( [0] => Array ( [0] => <h2>10. <em>Cruel</em> by St. Vincent</h2> [1] => 10. <em>Cruel</em> by St. Vincent ) [1] => Array ( [0] => <h2>9. <em>Robot Rock</em> by Daft Punk</h2> [1] => 9. <em>Robot Rock</em> by Daft Punk ) [2] => Array ( [0] => <h2>8. <em>Seven Nation Army</em> by the White Stripes</h2> [1] => 8. <em>Seven Nation Army</em> by the White Stripes ) [3] => Array ( [0] => <h2>7. <em>Do You Want To</em> by Franz Ferdinand</h2> [1] => 7. <em>Do You Want To</em> by Franz Ferdinand ) [4] => Array ( [0] => <h2>6. <em>Teenage Dream</em> by Katie Perry</h2> [1] => 6. <em>Teenage Dream</em> by Katie Perry ) [5] => Array ( [0] => <h2>5. <em>Crazy</em> by Gnarls Barkley</h2> [1] => 5. <em>Crazy</em> by Gnarls Barkley ) [6] => Array ( [0] => <h2>4. <em>Kids</em> by MGMT</h2> [1] => 4. <em>Kids</em> by MGMT ) [7] => Array ( [0] => <h2>3. <em>Bad Romance</em> by Lady Gaga</h2> [1] => 3. <em>Bad Romance</em> by Lady Gaga ) [8] => Array ( [0] => <h2>2. <em>Pumped Up Kicks</em> by Foster the People</h2> [1] => 2. <em>Pumped Up Kicks</em> by Foster the People ) [9] => Array ( [0] => <h2>1. <em>Paradise</em> by Coldplay</h2> [1] => 1. <em>Paradise</em> by Coldplay ) [10] => Array ( [0] => <h2>Song That Get Stuck In Your Head YouTube Playlist</h2> [1] => Song That Get Stuck In Your Head YouTube Playlist ) ) 

How to convert this array to simple and without duplicated elements? Thank you very much.

+7
source share
2 answers

You will always get a multidimensional array, however you can get closer to what you want:

 if (preg_match_all('#<h2>(.*?)</h2>#is', $source, $output, PREG_PATTERN_ORDER)) $matches = $output[0]; // reduce the multi-dimensional array to the array of full matches only 

And if you don’t want to load at all, use a non-exciting group:

 if (preg_match_all('#<h2>(?:.*?)</h2>#is', $source, $output, PREG_PATTERN_ORDER)) $matches = $output[0]; // reduce the multi-dimensional array to the array of full matches only 

Note that this preg_match_all call uses PREG_PATTERN_ORDER instead of PREG_SET_ORDER:

PREG_PATTERN_ORDER Orders the results, so $ matches [0] is an array of matches of the full pattern, $ matches [1] is an array of strings matching the first subpattern in brackets, etc.

PREG_SET_ORDER Orders the results, so $ matches [0] is an array of the first set of matches, $ matches [1] is an array of the second set of matches, and so on.

See: http://php.net/manual/en/function.preg-match-all.php

+6
source

Use

 #<h2>(?:.*?)</h2>#is 

like your regular expression. If you use a group without capture (which means ?: , The backward link will not appear in the array.

+1
source

All Articles