Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I have what I believe to be the start of the answer here. </p> <p>I'm looping through the $query and using unset() on each object as it's added to arrays within $result. </p> <p>Hopefully what's written here is as efficient as possible:</p> <pre><code>function cmp($a, $b){ return strcmp($a['start'], $b['start']); } $query = array(array('name' =&gt;'A','start' =&gt;'1/1/2011','end' =&gt;'1/31/2011'),array('name' =&gt;'B','start' =&gt;'1/15/2011','end' =&gt;'1/31/2011'),array('name' =&gt;'C','start' =&gt;'2/1/2011','end' =&gt;'2/28/2011'),array('name' =&gt;'D','start' =&gt;'2/2/2011','end' =&gt;'2/28/2011'),array('name' =&gt;'E','start' =&gt;'1/31/2011','end' =&gt;'3/1/2011'), array('name' =&gt;'F','start' =&gt;'3/3/2011','end' =&gt;'3/31/2011')); usort($query, "cmp"); // organize by start date $result = array(); $c = count($query); for($i = 1; $i &lt;= $c; $i++) { if (empty($result)) { $result[0][0] = $query[0]; unset($query[0]); $query = array_values($query); } else { $lastkey_group = array_pop(array_keys($result)); $lastkey_object = array_pop(array_keys($result[$lastkey_group])); // get the last object's end date $last_end_date = strtotime($result[$lastkey_group][$lastkey_object]['end']); $match_days = 1000; $match_key = 1000; foreach($query as $key =&gt; $q) { $this_start_date = strtotime($q['start']); $diff = round(($this_start_date - $last_end_date)/86400); // compare to start date in each $q if($diff &lt; $match_days &amp;&amp; $diff &gt;= 0) { // if the distance is greater than 0 but less than $diff, // replace match with distance and row key $match_days = $diff; $match_key = $key; } } if($match_key == 1000) { $result[$lastkey_group + 1][0] = $query[0]; // no good matches. write to a new group unset($query[0]); $query = array_values($query); } else { $result[$lastkey_group][$lastkey_object + 1] = $query[$match_key]; // match. write to this group unset($query[$match_key]); $query = array_values($query); } } } var_dump($result); </code></pre> <p>And here's the output of this:</p> <pre><code>array(3) { [0]=&gt; array(3) { [0]=&gt; array(3) { ["name"]=&gt; string(1) "A" ["start"]=&gt; string(8) "1/1/2011" ["end"]=&gt; string(9) "1/31/2011" } [1]=&gt; array(3) { ["name"]=&gt; string(1) "E" ["start"]=&gt; string(9) "1/31/2011" ["end"]=&gt; string(8) "3/1/2011" } [2]=&gt; array(3) { ["name"]=&gt; string(1) "F" ["start"]=&gt; string(8) "3/3/2011" ["end"]=&gt; string(9) "3/31/2011" } } [1]=&gt; array(2) { [0]=&gt; array(3) { ["name"]=&gt; string(1) "B" ["start"]=&gt; string(9) "1/15/2011" ["end"]=&gt; string(9) "1/31/2011" } [1]=&gt; array(3) { ["name"]=&gt; string(1) "C" ["start"]=&gt; string(8) "2/1/2011" ["end"]=&gt; string(9) "2/28/2011" } } [2]=&gt; array(1) { [0]=&gt; array(3) { ["name"]=&gt; string(1) "D" ["start"]=&gt; string(8) "2/2/2011" ["end"]=&gt; string(9) "2/28/2011" } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload