Search code examples
phpecho

Echo in one line in PHP


I want to change the original code I have,

echo "<p><strong>" . __('Area:', 'honegumi') . "</strong> " . number_format($productarea) . " m² (";
echo metersToFeetInches($productarea) . " ft²)" . "</p>";

into a single echo line as shown here:

echo "<p><strong>" . __('Area:', 'honegumi') . "</strong> " . number_format($productarea) . " m² (" . metersToFeetInches($productarea) . " ft²)" . "</p>";

But I'm getting some strange line breaks in this second case for metersToFeetInches($productarea).

Generated HTML:

    24,757
<p>
<strong>Area:</strong>
2,300 m² ( ft²)
</p>

Output:

    24,757
    

Area: 2,300 m² ( ft²)

How can I solve it? Is there any documentation I could read to learn how to do it by myself in the future?


Solution

  • I'm pretty sure I know what's going on here, your function metersToFeetInches is echoing a value rather than returning it.

    function metersToFeetInches() {
       echo 'OUTPUT';
    }
    
    echo 'FIRST '.metersToFeetInches().' LAST';
    // Outputs: OUTPUTFIRST  LAST
    

    echo metersToFeetInches() is actually redundant.

    This is because the function runs before the string you built is actually output. Note that both examples you posted would have this problem. Change your function to return a value instead. Afterwards, any places where you have used it like so:

    echo 'Something';
    metersToFeetInches();
    echo 'Something Else';
    

    You'll have to use an echo:

    echo 'Something';
    echo metersToFeetInches();
    echo 'Something Else';
    

    Functions should pretty much always return a value. Lesson learned, perhaps?


    If you are really in a bind and cannot change the function, you'll have to resort to output buffering:

    ob_start();
    metersToFeetInches($productarea);
    $metersToFeetInches = ob_get_clean();
    
    echo "<p><strong>" . __('Area:', 'honegumi') . "</strong> " . number_format($productarea) . " m² (" . $metersToFeetInches . " ft²)" . "</p>";
    

    ...which is rather silly to have to do.