-4

What is the best way to echo out an array where the values are grouped:

Array (
[0] => Service, Service, Service
[1] => 27 february, 2017, 27 march, 2017, 27 april, 2017
[2] => 08:00, 08:00, 08:00
)

If I want the result to be:

Service, 27 february, 2017 at 08:00.
Service, 27 march, 2017 at 08:00.
Service, 27 april, 2017 at 08:00.

This is what I have come up with so far:

<?php
$string = "Service, Service, Service, 8 mars, 2017, 22 mars, 2017, 5 april, 2017, 08:00, 08:00, 08:00";

$pattern = '/(\d+) (\w+), (\d+)/i'; //remove comma before year
$replacement = '${1} $2 $3';
$fixed = preg_replace($pattern, $replacement, $string);
 
$array = explode(', ', $fixed); 

$i=0;

foreach($array as $value) {
    echo $value.", ";
    $i++;

    if ($i == 3) {
        echo '<br>';
        $i = 0;
    }
}    
?>

The output:

Service, Service, Service, 
8 mars 2017, 22 mars 2017, 5 april 2017, 
08:00, 08:00, 08:00, 

So they are still in the wrong order... I just cant figure out how to sort the array and group the values I want one after another instead of in a row.

mickmackusa
  • 37,596
  • 11
  • 75
  • 105
David
  • 13
  • 3
  • 1
    How is this array formed?It might be easier to start there – Mihai Feb 26 '17 at 15:44
  • Take a look at: http://stackoverflow.com/q/797251/3933332 – Rizier123 Feb 26 '17 at 15:44
  • ...whenever you receive so many downvotes on your question, it generally means your question is horrible. People will downvote your question if you show no effort in solving the issue for yourself. Always research online manuals and stackoverflow answers before posting a question. It would be great if you would delete this question. – mickmackusa Mar 01 '17 at 07:31
  • Mihai: I use a wordpress plugin so i don´t want to hassle with to core code. I am given a varible that i want to render in a different way. – David Mar 07 '17 at 17:02
  • @David thank you for updating your question. Sadly, I doubt those that have downvoted it will return and remove their downvote. – mickmackusa Mar 10 '17 at 12:41

1 Answers1

0

There will be many ways to skin this cat.

I have endeavored to provide a flexible solution that you (or anyone else) can simply modify if/when your string contains more or less than 3 rows of values

$string="Service, Service, Service, 8 mars, 2017, 22 mars, 2017, 5 april, 2017, 08:00, 08:00, 08:00";

$string=preg_replace('/(\d{1,2}\s\w+),(\s\d{4})/','$1$2',$string);
/* "Service, Service, Service, 8 mars 2017, 22 mars 2017, 5 april 2017, 08:00, 08:00, 08:00" */

$array=explode(', ',$string); // divide at comma&space's
/*  array (
        0 => 'Service',
        1 => 'Service',
        2 => 'Service',
        3 => '8 mars 2017',
        4 => '22 mars 2017',
        5 => '5 april 2017',
        6 => '08:00',
        7 => '08:00',
        8 => '08:00'
    ) */
$rows=3;  // change this if your original string holds > or < 3 rows
$array=array_chunk($array,$rows); // group elements into specified number of rows
/*  array (
        0 => array (
            0 => 'Service',
            1 => 'Service',
            2 => 'Service'
        ),
        1 => array (
            0 => '8 mars 2017',
            1 => '22 mars 2017',
            2 => '5 april 2017'
        ),
        2 => array (
            0 => '08:00',
            1 => '08:00',
            2 => '08:00'
        )
    ) */

// loop indexes of each element in the first sub-array (group/chunk)
foreach(array_keys($array[0]) as $key){
    // access each value in all sub-arrays with same key/index (column)
    /* column 0 holds:
            array (
                0 => 'Service',
                1 => '8 mars 2017',
                2 => '08:00'
            ) */
    // then join them together using a space as glue
    // and push into the final array
    $result[]=implode(' ',array_column($array,$key));
}

/* result holds:
        array (
            0 => 'Service 8 mars 2017 08:00',
            1 => 'Service 22 mars 2017 08:00',
            2 => 'Service 5 april 2017 08:00'
        )

For anyone who prefers a compact (and nearly unreadable) function to call, here you go:

function davids_WP_workaround($string,$rows){
    $array=array_chunk(explode(', ',preg_replace('/(\d{1,2}\s\w+),(\s\d{4})/','$1$2',$string)),$rows); // group 9 elements into sets of 3 elements
    foreach(array_keys($array[0]) as $key){
        $result[]=implode(' ',array_column($array,$key));
    }
    return $result;
}

$string="Service, Service, Service, 8 mars, 2017, 22 mars, 2017, 5 april, 2017, 08:00, 08:00, 08:00";

echo "<pre>";
var_export(davids_WP_workaround($string,3));
echo "</pre>";
mickmackusa
  • 37,596
  • 11
  • 75
  • 105
  • That did the trick @mickmackusa, thank you for taking the time and help me! All that is missing now is a count on the array so the function can be feed with to correct amount of rows, but that´s not going to be a problem :) – David Mar 13 '17 at 20:14