File existence and info checks in PHP - Time & Space Complexity
When checking if files exist or getting their info, the time it takes depends on how many files we check.
We want to know how the time grows as we check more files.
Analyze the time complexity of the following code snippet.
$files = ['file1.txt', 'file2.txt', 'file3.txt'];
foreach ($files as $file) {
if (file_exists($file)) {
$size = filesize($file);
$modified = filemtime($file);
echo "$file: Size $size bytes, Modified $modified\n";
} else {
echo "$file does not exist.\n";
}
}
This code checks each file in a list to see if it exists, then gets its size and last modified time.
- Primary operation: Looping through each file and calling file_exists, filesize, and filemtime.
- How many times: Once for each file in the list.
Each file check takes some time, so more files mean more total time.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 file checks and info calls |
| 100 | About 100 file checks and info calls |
| 1000 | About 1000 file checks and info calls |
Pattern observation: The total work grows directly with the number of files.
Time Complexity: O(n)
This means the time grows in a straight line as you check more files.
[X] Wrong: "Checking multiple files is just as fast as checking one file."
[OK] Correct: Each file check takes time, so more files add up and take longer overall.
Understanding how file checks scale helps you write efficient code when working with many files, a common real-world task.
"What if we used a function that checks all files at once? How would the time complexity change?"
Practice
Solution
Step 1: Understand the purpose of file_exists()
The function file_exists() returns true if the file or directory exists at the specified path.Step 2: Compare with other functions
Functions like is_file() check if the path is a file, filesize() returns size, and is_readable() checks permissions, but none check existence alone.Final Answer:
file_exists() -> Option CQuick Check:
Check existence = file_exists() [OK]
- Confusing is_file() with existence check
- Using filesize() to check existence
- Assuming is_readable() means file exists
Solution
Step 1: Recall the correct function name
PHP uses is_dir() to check if a path is a directory.Step 2: Verify syntax correctness
The function is called as is_dir($path); other options are invalid function names.Final Answer:
is_dir($path); -> Option BQuick Check:
Directory check = is_dir() [OK]
- Using non-existent functions like is_directory()
- Mixing up is_file() and is_dir()
- Missing parentheses in function call
$file = 'example.txt';
if (file_exists($file)) {
echo filesize($file);
} else {
echo 'File not found';
}Solution
Step 1: Check file existence
The code uses file_exists() to confirm 'example.txt' exists, which it does.Step 2: Output file size
Since the file exists, filesize($file) returns 150, which is printed.Final Answer:
150 -> Option AQuick Check:
File exists, output size = 150 [OK]
- Assuming filesize() works without checking existence
- Confusing filesize() output with file content
- Expecting 'File not found' when file exists
$filename = 'data.txt';
if (is_writeable($filename)) {
echo 'Writable';
} else {
echo 'Not writable';
}Solution
Step 1: Check function spelling
The correct function to check if a file is writable is is_writable(), not is_writeable().Step 2: Verify other syntax
Semicolons are present, variable quotes are valid, and is_writable() does check permissions.Final Answer:
The function name is misspelled; should be is_writable() -> Option DQuick Check:
Correct spelling = is_writable() [OK]
- Misspelling is_writable() as is_writeable()
- Thinking variable needs double quotes
- Confusing permission check with existence
Solution
Step 1: Understand requirements
We need to list files in 'docs/' that exist, are readable, and modified within last 24 hours (86400 seconds).Step 2: Analyze each option
$files = scandir('docs/'); foreach ($files as $file) { $path = 'docs/' . $file; if (file_exists($path) && is_readable($path) && (time() - filemtime($path) < 86400)) { echo $file . "\n"; } } correctly scans 'docs/', builds full path, checks file_exists(), is_readable(), and filemtime() against current time minus 86400 seconds. Other options miss one or more conditions or use wrong paths.Final Answer:
Option A code snippet -> Option AQuick Check:
Check existence + readability + recent mod = $files = scandir('docs/'); foreach ($files as $file) { $path = 'docs/' . $file; if (file_exists($path) && is_readable($path) && (time() - filemtime($path) < 86400)) { echo $file . "\n"; } } [OK]
- Not using full path when checking files
- Ignoring file modification time condition
- Checking is_writable() instead of is_readable()
Ready to prove it?
Pass the test and this pattern moves unknown
