Convert Decimal to Octal in PHP

Beginner
⏱️ 9 min read
📚 Updated: May 2026
🎯 2 Code Examples
Base conversion

What you’ll learn

  • How division by eight and remainders produce octal digits 07.
  • Why zero needs a branch and why digits are printed in reverse of collection order.
  • A recursive MSB-first print without an array, a live preview, and ties to binary grouping.

Overview

Octal is base eight. To print a nonnegative decimal integer in octal, repeatedly take n % 8, then replace n by intdiv(n, 8), until n is zero; emit the remainders from last to first.

Two programs

Array + reverse print (classic), then recursion for MSB-first output.

Live preview

Nonnegative safe integers via Number#toString(8).

Pair with binary

Same remainder pattern as decimal-to-binary, divisor 8 instead of 2.

Prerequisites

Integer division and modulo, arrays, for and while loops, optional recursion.

  • Basic PHP script structure, functions, and echo.
  • Use intdiv() for clean integer division in conversion loops.

Decimal to octal

Each octal digit is a coefficient on a power of eight: dk8k + … + d080 with every di ∈ {0,…,7}. The peel operation n % 8 reads the least significant octal digit.

Reference value 57: 57 = 7·8 + 1, so octal digits (MSB to LSB) are 7 then 1718.

Decimal base 10
Octal base 8
Digits 0 – 7

Division algorithm

For n ≥ 0, let d0 = n mod 8 and n1 = ⌊n/8⌋, then repeat. The sequence of remainders read from last generated to first is the standard octal numeral for n.

57

57 = 8·7 + 1, then 7 = 8·0 + 7. Remainders LSB-first: 1, 7 → octal 71.

Intuition

64 100 (oct)
Power
82
57 71 (oct)
Sum
7·8 + 1

Takeaway: each % 8 answers “which slice of eight fits in the current place?”

Live preview

Nonnegative integers in the JavaScript safe range. Uses Number#toString(8).

Negative values are rejected; use nonnegative input for this learning page.

Live result
Press “Show octal” to convert.

Algorithm (remainder method)

Goal: print octal digits of nonnegative n in MSB-first order.

Special case n == 0

Print 0 when n is zero; while ($n > 0) alone skips the body.

Collect digits

While $n > 0: push $n % 8, then $n = intdiv($n, 8).

Print reversed

Emit stored digits from last pushed to first.

📜 Pseudocode

Pseudocode
function printOctalFromDecimal(n):  // n ≥ 0
    if n = 0:
        output "0"; return
    digits ← empty list
    while n > 0:
        append (n mod 8) to digits
        n ← floor(n / 8)
    print digits in reverse order
1

Divide by eight with reverse print

Matches the standard interview flow with a zero branch and integer division. Uses a digit buffer and reverse output.

php
<?php
function decimalToOctal(int $decimalNumber): string
{
    if ($decimalNumber === 0) {
        return "0";
    }

    $octalDigits = [];
    $n = $decimalNumber;

    while ($n > 0) {
        $octalDigits[] = (string)($n % 8);
        $n = intdiv($n, 8);
    }

    return implode('', array_reverse($octalDigits));
}

echo "Octal equivalent: " . decimalToOctal(57) . "\n";
echo "Octal equivalent: " . decimalToOctal(0) . "\n";
?>

Explanation

Each remainder is in 0..7 by construction, so a single decimal digit per position is enough for display.

while ($n > 0)

Same stopping idea as C version, paired with an upfront 0 branch.

2

Recursive MSB-first (no digit array)

Prints higher groups before lower ones: recurse on intdiv($n, 8), then emit $n % 8. Handles $n == 0.

php
<?php
function printOctalMsbRecursive(int $n): void
{
    if ($n >= 8) {
        printOctalMsbRecursive(intdiv($n, 8));
    }
    echo (string)($n % 8);
}

echo "57 in octal: ";
printOctalMsbRecursive(57);
echo "\n";

echo "0 in octal: ";
printOctalMsbRecursive(0);
echo "\n";
?>

Explanation

This keeps code short and readable for beginners because recursion naturally prints digits from left to right.

echo (string)($n % 8);

Digit output. Octal digits are always 0 to 7.

Optimization and library path

decoct($n). For nonnegative integer $n, returns octal directly without manual loops.

From binary. Group bits in threes from the right to jump between bases without repeated division by eight.

Interview: state nonnegative assumption, n==0, and the 3-bit grouping trick.

❓ FAQ

Octal is base 8. The remainder n % 8 is the least significant octal digit; integer division n/8 removes that digit, just like decimal to binary uses 2.
The first remainder is the rightmost (least significant) octal digit. Printing from last remainder to first yields MSB-to-LSB order.
while (n != 0) never runs, so you must return or print 0 explicitly.
Yes: decoct($n) returns the octal representation as a string for nonnegative integers.
One octal digit encodes exactly three bits. Converting binary to octal groups bits in threes from the radix point outward.
O(log8 n) = O(log n) octal digits for nonnegative n using the remainder method; the recursive print does one call per digit.

🔄 Input / output examples

Example 1 uses 57 and 0; Example 2 repeats 57 and 0 with the recursive printer.

DecimalOctal
00
77
810
5771
64100

Edge cases and pitfalls

For a beginner page, keep the policy simple: accept nonnegative integers and clearly reject other input.

Zero

n == 0

The conversion loop skips zero; always return or print 0 explicitly.

Digits

Remainder range

For nonnegative n, n % 8 is always in 0..7. If you see 8 or 9, logic is wrong.

Recursion

Very large integers

PHP integers are platform-limited. For extremely large values, use big-int libraries and iterative conversion.

Sign

Negative policy

If negatives are required, define output format clearly; this page focuses on nonnegative input for clarity.

⏱️ Time and space complexity

ApproachTimeExtra space
Remainder + arrayO(log8 n) digitsO(log8 n) stored digits
Recursion (Example 2)O(log8 n)O(log8 n) call frames
decoct($n)Implementation-defined; typically O(d)O(1)

Here n is the magnitude of a nonnegative input.

Summary

  • Idea: collect n % 8, divide n by 8, reverse for display.
  • Code: guard 0; use intdiv() for integer division in PHP.
  • Extra: octal lines up with binary in groups of three bits.
Did you know?

Each octal digit corresponds to a block of three binary bits, which is why octal is a handy short form for binary values.

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

8 people found this page helpful