- PeterMoulding.com
- Author
- Trainer
- Speaker
- Business Coach
- How to write a How To book
- PHP Courses
- Speaking
- Web Architect
- Australia
- Books
- Authors
- Akkana Peck
- Alex Berenson
- Andrew Nugent
- Ben Sanders
- Brock Clarke
- Chris Simms
- David Mercer
- Dianna Mullet
- Don Winslow
- Dori Smith
- Harlan Coben
- Jack McDevitt
- James Wines
- Jerry Yudelson
- John Grisham
- Kevin Mullet
- L. E. Modesitt Jr.
- Laurell K. Hamilton
- Marshall Karp
- Martina Cole
- Michael Marshall Smith
- Michel Roux Jr
- Nadia Sawalha
- Philip Pullman
- Raymond Khoury
- Richard North Patterson
- Robert Masello
- Sally Roth
- Sarah Langan
- Stella Rimington
- Stephen Booth
- Stephen King
- Stephen Leather
- T.C. Boyle
- Tom Negrino
- Tony Hillerman
- Urban Waite
- Val McDermid
- Valerio Massimo Manfredi
- Beginning GIMP
- Beginning Visual C++
- Culturalism
- Fiction
- A Drink Before The War
- A Talent for War
- Bag of Bones
- Blood and Ice
- Burn
- Dark Lady
- Dead Line
- Eclipse
- Empress of Eternity
- Exley
- Flipping Out
- Just One Look
- Nightfall
- Pet Sematary
- Savage Moon
- Skinwalkers
- Starvation Lake
- The Fallen
- The Gardens of the Dead
- The Jump
- The Last Templar
- The Mermaids Singing
- The Midnight Mayor
- The Secret Soldier
- The Summons
- The Terror of Living
- The Testament
- The Tower
- Under the Dome
- Virus
- AJAX and PHP
- Aging with Grace
- Food books
- Green Architecture
- Life Is So Good
- SQL: The Complete Reference
- The Backyard Bird Lover's Ultimate How-to Guide
- The Garden Gurus
- Authors
- Sustainability
- -18 hours left to decide the future of Australia
- Campbells vegetable stock or Massel vegetable stock?
- Carbon Sequestration
- Carbon tax for Australia is a fraud
- Copenhagen will fail
- Cost of living in Australia
- Dick Smith jumps on the population bandwagon
- Dry Run: Preventing the Next Urban Water Crisis
- Energy Saving Lights
- Garlic
- How many people can live in Australia?
- Its obsolete, throw it out!
- Julia Gillard offers 9.9 billion dollars bribe to Rob Oakeshott
- Laundry detergent
- Petrol or Diesel?
- Reflective foil batts kill
- RoHS
- Sea level to rise 3mm due to climate change
- Solar power
- Spring again in Sydney
- Sustainable fuels
- The CRUD Tax is back
- The people who make building regulations do not own houses
- Water efficiency
- Which insulation is safer, foil or wool?
- Will Australia reduce greenhouse gas emissions?
- Technology
- Android or Blackberry or iPhone or a flip phone?
- Apple versus Google 2011
- Cameras
- Cars
- Colour
- Burgundy
- Colour Blindness
- Colour Names
- Dulux colours
- Pantone colours
- Safe Colours
- Seculine ProDisk Mini colour balance card
- What Causes Colour Blindness?
- Hardware
- Batteries for the Digital Age
- Cables
- Cases
- Computer reliability
- Computrace
- Disks
- Astone ISO Gear 481E
- Best SSD for your notebook computer
- Disk block size
- Hitachi disk HDS722020ALA330
- LaCie USB 2.0 250 GB mobile hard drive design by F.A. Porsche
- SMART disk
- Samsung 2 TB HD204UI quiet low power disk for mass storage
- Seagate and Samsung merge disk business
- Select the right disk for your RAID array
- USB disk speed
- Western Digital WD20EARX 2 GB SATA 3 disk
- How long should computer hardware last?
- Keyboards
- Mainframe
- Memory cards
- Monitors
- Netbooks, notebooks, tablets, and xPads
- Network Attached Storage
- OLED Displays
- PC's are a thing of the past
- Printers
- Quiet
- Samsung Galaxy S
- Speed
- Television
- Tools
- USB
- Worst computer movies
- Xserve is dead. What next?
- Your backup will not work
- Z68 motherboards
- iPad or Acer Aspire One?
- IQ
- LG Intello Washing Machine
- Lack of a challenge
- Networks
- 802.11n wireless networking
- D-Link DIR-655 wireless router
- D-Link DWA-160 Xtreme N dual band USB adapter
- D-Link DWA-556 Xtreme N PCI Express desktop adapter
- MIMO
- NBN spends another $12 billion of our tax money on nothing
- National Broadband Network
- Netgear wireless modem router DGND3300 with 300 Mbps 802.11n
- Refrigerator kills wireless broadband
- Small Wireless Network
- TP-LINK TL-SG10005D 5 port gigabit switch
- TP-Link TL-WR1043N wireless N gigabit router
- Telstra Pre-paid Mobile Wi-Fi
- Where are the router plus proxy server combinations?
- Open Source documentation
- Software
- 7-zip
- Accounting
- Asterisk
- Audacity
- Backup software
- Bloat only in Windows
- CAD
- CDex
- Disk imaging software for copying and backup
- Exact Audio Copy
- Filezilla
- Firefox
- Java
- LibreOffice or OpenOffice?
- Linux
- 1 in 5 servers will ship with Linux
- Android phones outsell iPhone
- Another Move to Linux
- CentOS 5.5 installation on SSD and RAID 5
- Debian
- Debian 5.0.5 AMD64 installation
- Debian 5.06 installation
- Fedora
- Fedora or Ubuntu?
- Gnome or KDE?
- K9copy
- Linux 2.6.38
- Linux Gnome login settings lost
- Linux Mint
- Linux RAID, a rant
- Linux Speed
- Linux Time
- Linux reliability as demonstrated by Ubuntu 10.10
- Linux reliability as demonstrated by Ubuntu 11.4
- Linux still a struggle in 2011
- Linux workstation disk RAID 1
- Linux, NT, Windows, and SETI
- Linux, three years of progress
- London Stock Exchange switches to Linux
- Mandrake Linux 9.2
- The partition is misaligned by 48128 bytes - warning from Linux RAID
- Ubuntu
- How to fix the scroll bars in Ubuntu 11.4 Gnome
- Kubuntu 10.10 alternate installation on desktop with RAID 1
- POWbuntu
- Ubuntu 10.10 after 6 months use
- Ubuntu 10.10 alternate installation
- Ubuntu 10.10 desktop RAID 1
- Ubuntu 10.10 desktop RAID 5
- Ubuntu 10.10 desktop install on a netbook
- Ubuntu 10.10 desktop installation
- Ubuntu 10.10 netbook install on a netbook
- Ubuntu 10.10 server AMD64
- Ubuntu 10.10 upgrade to version 11.4 beta 2
- Ubuntu 10.4
- Ubuntu 11.10
- Ubuntu 11.10 first upgrade
- Ubuntu 11.4 after one month use
- Ubuntu 12.04 beta1 desktop amd64
- Ubuntu One
- Ubuntu by Microsoft?
- Ubuntu desktop upgrade 10.4 to 10.10 failed because I did not check the media
- Ubuntu strikes again
- Upgrade Ubuntu to Linux Mint 12 LDXE for extra speed
- Yes, use Linux but not that distribution!
- Nero
- OpenOffice
- OpenOffice is now Apache Office
- Project management
- Scribus
- Software for Windows and Linux
- Text editors
- Time
- Todo applications
- Tomboy notes
- Top text editors
- Version control
- VideoLAN VLC media player
- Visio
- Webmin
- Webmin installation on CentOS for Web development
- Webmin installation on Ubuntu
- What is the most popular open source software today?
- Windows
- Another Windows person goes Linux
- BAD_POOL_CALLER
- Cygwin
- Microsoft Malicious Software Removal Tool cannot find a common virus
- One of the developers of Windows XP is criminally insane
- There are unused icons on your desktop
- W32time
- Which Windows version?
- Windows 7 Home Premium
- Windows XP Stop 0x0000007B during installation
- Windows XP is a disaster
- Windows processes
- XML
- Zip, bzip, gzip, or 7zip?
- configFree
- Technology Succession Planning
- VoIP
- Web Sites
- Drupal
- Do Drupal themes have to use the GPL?
- Drupal 7
- A better search facility for Drupal
- Drupal - performance or flexibility
- Drupal 7 Fields are hard to fix
- Drupal 7 new features
- Drupal 7 ships on January 5
- Drupal 7.14
- Drupal 7.4 hits PeterMoulding.com
- Drupal function sequence
- The evolution of a module
- Undefined index: headers in DefaultMailSystem->mail() (line 54 of /modules/system/system.mail.inc).
- Undefined index: to in DefaultMailSystem->mail() (line 83 of /modules/system/system.mail.inc).
- implode(): Invalid arguments passed in DefaultMailSystem->format() (line 23 of /modules/system/system.mail.inc).
- Drupal 8
- Drupal Code Load Cut
- Drupal How To
- Drupal Modules
- Backup and Migrate
- Browscap
- CKEditor with Drupal WYSIWYG
- Captcha
- Cel
- Colorbox
- Content Construction Kit
- Content type
- Devel module for Drupal
- Drupal Rules as an automation language
- Drupal Spam add-on module
- Form alter to node
- IMCE
- IMCE Wysiwyg bridge
- ImageAPI
- Jdog
- Lightbox2
- Module variable
- Node Gallery Access
- Node_Gallery
- Path
- Path redirect
- Pathauto
- Pet
- Search
- Service links
- Session Variable
- Statistics
- Taxonomy
- Token
- Token ex
- Transliteration
- Trigger
- Watch
- Other modules
- Drupal Training
- Drupal access controls need a major rewrite
- Drupal coding tricks
- Drupal performance
- Drupal themes for the future
- Drupal.org colours
- Import existing data into Drupal
- Multiple Web sites made easy using Drupal multisite and the right start
- drupal_lookup_path()
- Adobe PDF
- Apache
- Apache Mahout
- Audi.com
- Bleet
- CSS Strikes Again
- CSS or xCSS
- Can you believe Facebook or email?
- Content Management Systems
- Databases
- Facebook scam
- Font
- Fonts
- HTML
- Install Apache, MySQL, and PHP 5 in Ubuntu 11.4 using the Ubuntu Software Centre
- Language Codes
- Marketing
- Memcache
- Nginx
- Open source development hits another roadblock
- Oscars
- PHP
- SPDY
- Search software
- Techoni.com.au
- Theme themes
- Things to hate on Web sites
- U.S. Patent No. 6,985,875
- Virtual Private Server
- Visible Improvement
- Web 4.0
- Web browser usage
- Web browsers
- Web site development
- Bluefish
- Crying over spilt code
- Eclipse and PHP
- Getting a Git client, a story of ancient technology and pain
- HTTrack
- MVC
- Netbeans
- PHP or ..., CakePHP/Symfony/ZF versus ...
- Programming
- Superfish
- Web browser emulators for testing your Web site
- Web development frameworks
- Web site books
- Web site development on your own computer
- Webmin or phpMyAdmin or cPanel for creating databases?
- aiki framework
- jQuery
- Views development - Learn Fields first
- Views development - Learn Actions and Rules
- jQuery .each()
- jQuery .has()
- jQuery .is()
- jQuery and Firefox Firebug
- jQuery children
- jQuery for people not using Drupal - Installation and getting started
- jQuery hover
- jQuery hover de-duplication example
- jQuery or CSS?
- jQuery performance
- jQuery tests
- Web site hosting
- Westpac Web site still broken after two years and ten months
- Wordpress wins another CMS survey
- Drupal
Read a command parameter list from an array of strings
Submitted by Peter on Thu, 2011-08-25 20:31
Drupal:
technology:
There is often a need to read lists of parameters from text files and this page tests one approach. There is a need to read structured fields from Drupal before installing the modules for structured fields. The same command string approach works in Drupal.
Start with a simple example input then we will add complications. The input could be in a file and there are lots of ways to read files. For this test page, we will start with data in a list implemented as a PHP array.
Line input with a fixed two column input
Each item is a command followed by data and the two parts separated by a vertical line, |, also called a pipe character because some operating systems assign a special use to the character in some circumstances.
$list = array('add|abc', 'add|xyz', 'delete|abc');The list is equivalent to a text file containing the following lines.
add|abc
add|xyz
delete|abc
How would we convert the lines to a table that is easy to process in PHP code? The following code reads the list of input and creates a new list with each part of each line as a separately named item. The explode() function is an easy way to split text based on a single separator. we could add trim() and other functions to remove spaces and other rubbish around the commands.
$commands_split = array();
foreach($list as $line)
{
$command_parts = explode('|', $line);
$commands_split[] = array('command' => $command_parts[0], 'data' => $command_parts[1]);
}
Lets print the data as a table.
| Command | Data |
|---|---|
| add | abc |
| add | xyz |
| delete | abc |
Line input with a fixed two column input and some comments
Add an option for comments. Some control files use ; to indicate comments and this test uses ;. We will allow for comments by themselves and at the end of a line. ; cannot be part of the data.
$list = array('; test file', 'add|abc', 'add|xyz ; comment at the end of the line.', 'delete|abc');The list is equivalent to a text file containing the following lines.
; test file
add|abc
add|xyz ; comment at the end of the line.
delete|abc
We will split the comment from the line before decoding the command. The result is in $line_parts and the command may be in $line_parts[0]. We trim $line_parts[0] to remove unwanted spaces then use $line_parts[0] only of it is not empty.
$commands_split = array();
foreach($list as $line)
{
$line_parts = explode(';', $line);
$line = trim($line_parts[0]);
if(!empty($line))
{
$command_parts = explode('|', $line);
$commands_split[] = array('command' => $command_parts[0], 'data' => $command_parts[1]);
}
}
Add an extra check for spaces
Your friends might add spaces anywhere when typing in the commands so add some extra checks for spaces. Add trim() as shown in the following line.
$commands_split[] = array('command' => trim($command_parts[0]), 'data' => trim($command_parts[1]));
Allow for an extra parameter
We will add a rename command that requires a second parameter then modify the code to fit the extra parameter. We will leave out comments and spaces for the remaining examples.
$list = array('add|abc', 'add|xyz', 'rename|xyz|x2', 'delete|abc');
The following example shows the code altered to count the split parts and create the output based on the number of parts.
$commands_split = array();
foreach($list as $line)
{
$command_parts = explode('|', $line, 3);
if(count($command_parts) == 3)
{
$commands_split[] = array('command' => $command_parts[0], 'data' => $command_parts[1], 'new name' => $command_parts[2]);
}
else
{
$commands_split[] = array('command' => $command_parts[0], 'data' => $command_parts[1]);
}
}
The following example shows another way to process the parts. This approach ensures there is always a third parameter in each row to make some types of subsequent processing easier. If you do not create a default value for the third parameter, you have to check if the parameter exists before using the parameter.
$commands_split = array();
foreach($list as $line)
{
$command_parts = explode('|', $line);
if(!isset($command_parts[2]))
{
$command_parts[2] = '';
}
$commands_split[] = array('command' => $command_parts[0], 'data' => $command_parts[1], 'new name' => $command_parts[2]);
}
Error checking and reporting
You could add checks for the number of parameters per type of command then highlight incorrect combinations. When processing string information of this type, you need to check a few examples then test for all the mistakes you find in the input. Do you reject all the input because one line is wrong or process the correct lines? The decision is yours based on your knowledge of the data and how it is used.
Add an optional sequence field
we want some commands to run first. We want some in a specific sequence. How can we add add an obvious sequence field without adding a field we might confuse with parameters? Add the sequence up front where we can distinguish the sequence from the alphabetic command string.
$list = array('add|abc', '1|add|xyz', '2|rename|xyz|x2', 'delete|abc');
How does the latest version of the data look in a table?
| Command | Data | Optional parameter | Sequence |
|---|---|---|---|
| add | abc | ||
| add | xyz | 1 | |
| rename | xyz | x2 | 2 |
| delete | abc |
How do we put it in sequence?
First split the table into sequenced and unsequenced commands. Note the sequenced commands have an additional automatic sequence, $sequenced['sequence'][], to allow for duplicate sequence numbers.
$sequenced = array();
$unsequenced = array();
foreach($commands_split as $command)
{
$sequence = $command['sequence'];
unset($command['sequence']);
if(empty($sequence))
{
$unsequenced[] = $command;
}
else
{
$sequenced[$sequence][] = $command;
}
}
We can now sort the sequenced commands by the sequence key using ksort().
ksort($sequenced);
Next we display the two lists in one table.
| Command | Data | Optional parameter | Sequence |
|---|---|---|---|
| add | xyz | 1 | |
| rename | xyz | x2 | 2 |
| add | abc | ||
| delete | abc |
Store it in Drupal 7
You can store the input data and the results in any version of the Drupal content management system. Drupal 7 provides some particularly easy ways to store and display multiple values. You would be wasting your time if you decided to use the web for storage or display then chose a content management system with less flexibility.
Where is this useful?
Simple text input formats let you send input through email and many other odd forms. You could send a list of commands or options to a server using email or type them in through a form. When you add Drupal to the mix, the data can be displayed on a page for visual verification before action. The list could be multiple entries in a field. The options are endless.
Some bug tracking systems, including Mantis, can read email to accept new posts. Those posts could contain commands for action if you added code in the right place, code similar to the code shown on this page.
Back in the early days of the Web, before the invention of SVG, I wrote a program to dynamically generate 2D images based on an assembly of parameters similar to what you would now perform using SVG. The parameters were formed into simple text commands so they could be transmitted through any format file, text, word processing, and edited using the most primitive editors plus all the editors that swamp the text in formatting. That old program had more code to extract the data from unwanted formatting and had some code to convert the parameters into graphical commands for use in the graphical software available back then. The results were spectacular and nearly bullet proof.
I found only one problem with that early program. In Germany, using a German format keyboard, I found one of the common English keyboard characters was hard to type and I made a slight change to the input format to remove that one difficult character. If you accept text from other countries, check their character sets and find out what is easiest on their keyboards.








