Question

Snippet:

$temp = array();
foreach ($data as $key => $value) {
    // This line varies, from HTML to URLs, to anything in between
    array_push($temp, "<b>$key:</b> $value"); 
}
$request = implode('<br/>', $temp); // Glue also varies depending on needs
unset($temp);

This is a getaway from the usual $string .= 'blah<br/>'. Never mind the rtrim.

Can anyone show me a better way to achieve above without use of a temp array and possibly without a loop? Bonus points for not using above code in a function, lambda acceptable though.

P.S. While writing this question I have found a wonderful http_build_query(). One down, one to go.

Edit:

What result should look like:

<b>Title: </b> Value</br>
<b>Title2: </b> Value2</br>
<b>Title3: </b> Value3

Or with different settings (not required, but shows possibility):

key=value&key2=value2&key3=value3

I am trying to improve my code, I use the above snippet everywhere.

Was it helpful?

Solution

My answer: There are some ways, but:

Loops & arrays are the best friends of any programmer.

They provide pretty good readability, reusability and generally are considered to be a right way for performing pretty much the same actions.

You may also take a look on array_map or array_walk. Less code, but it is a loop anyways.

array_walk($data, function($value, $key){
  $temp[] = "<b>{$key}:</b> {$value}" ;  //Shorthand for array_push is $arr[] = $value ;
}) ;

OTHER TIPS

I suppose this is one way; yay for "one-liners":

$data = ...;

echo join("\n", array_map(function($key) use ($data) {
    return sprintf('<b>%s:</b> %s',
        htmlspecialchars($key, ENT_QUOTES, 'UTF-8'),
        htmlspecialchars($data[$key], ENT_QUOTES, 'UTF-8')
    );
}, array_keys($data)));

You basically map the keys using a closure that binds the original array as well so that you have access to both the key and value in each invocation.

I think you will prefere your solution:

$data = range('a', 'e'); // some data
$request = ''; // empty string
array_map(function($value, $key)use(&$request, $data){
    static $i = 1;
    if($i == count($data)){
        $request .= "<b>$key:</b> $value";
    }else{
        $request .= "<b>$key:</b> $value<br/>";
    }
    $i++;
}, $data, array_keys($data));

echo $request;

Online demo


A solution with a loop but without $temp array:

$data = range('a', 'e'); // some data
$request = ""; // empty string
foreach ($data as $key => $value) {
    $request .= "<b>$key:</b> $value<br/>"; // add to string
}
$request = substr($request,0,-5); // remove last <br/>
echo $request; //output
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top