Pragmatism in the real world

Recursively deleting elements from an array

I had a need recently to delete items from a nested associative array and also any empty sub-arrays. My initial thought was to use array_walk_recursive, but this doesn't work as you can't unset nested elements and you only have access to the leaves. Clearly I needed a recursive function. I'm sure that this has been done many times before, but this is my solution: /** * Remove any elements where the callback returns true *… continue reading.

SSL certificate verification on PHP 5.6

I recently updated my local OS X Zend Server installation to PHP 5.6 and when I ran composer self-update, I got this error message: [Composer\Downloader\TransportException] The "https://getcomposer.org/version" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed Failed to enable crypto failed to open stream: operation failed Googling around, I finally worked out that there have been various SSL improvements in PHP 5.6 and that the problem… continue reading.

Overriding the built-in Twig date filter

In one project that I'm working on, I'm using Twig and needed to format a date received from an API. The date string received is of the style "YYYYMMDD", however date produced an unexpected output. Consider this: {{ "20141216"|date('jS F Y') }} creates the output: 20th May 1976 This surprised me. Then I thought about it some more and realised that the date filter is treating my date string as a unix timestamp. I investigated… continue reading.

Autocomplete Phing targets on the command line

Shortly after writing my last post, it crossed my mind that it would be nice if I could autocomplete the targets in my Phing build file on the command line. In order to do this, I read Buddy Lindsey's Quick and Dirty Write Your Own Bash Autocomplete and made it do what I needed! Start by creating a new bash completion file in the bash_completion.d directory. This file needs executable permission. This directory can usually… continue reading.

A few Phing tips

Following on from my last post, here's a few other Phing things that I've found helps me. Hiding targets from Phing -l I have a number of dependent targets in my build.xml that I don't want listed when I run phing -l. The easiest way to do this is to add the hidden="true" property to the targets I want to hide: <?xml version="1.0"?> <project name="buildfile" default="foo"> <target name="foo" depends="bar,baz" /> <target name="bar" hidden="true"> <!– tasks… continue reading.

Using Phing to SSH into a Vagrant box

Now that I've started using migrations, I've discovered a minor irritant. I run this project on a Vagrant VM and have discovered that I keep forgetting to ssh into the vagrant box before running the migrations script. The obvious solution is to automate this and I decided to use Phing to do so. Firstly, I needed to install the PHP ssh2 extension: $ brew install libssh2 $ sudo pecl install pecl.php.net/ssh2-beta I'm on OS X,… continue reading.

Registering Doctrine Type Mappings for standalone migrations

Shortly after starting to use Doctrine Migrations as a standalone tool in my project, I came across this error message: Unknown database type bit requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it. This means that I have a column in my database of type bit which is used for booleans in SQL Server, but confuses the MySQL platform as it's not a default mapping. To support this, you need to modify the database connection's Platform object to… continue reading.

Using Doctrine Migrations as a standalone tool

My current project has reached the point where a good migrations system is required. As I'm targeting two different database engines (MySQL and MS SQL Server) and we're already using DBAL, it made sense to use Migrations from the Doctrine project. To do this, I updated my composer.json with the following require statements: "doctrine/migrations": "1.0.*@dev", "symfony/console": "~2.5" in order to install Migrations and also Symfony console component so that I can run it from the… continue reading.

substr_in_array

No matter what I want to do with an array, PHP usually has a first class method that does it. I was therefore surprised that in_array() didn't handle substring matches. (I was sure there was a flag, but apparently not!) No doubt everyone has their own version of this, but here's mine so that I don't have to recreate it next time: /** * A version of in_array() that does a sub string match on… continue reading.

Setting up PHP & MySQL on OS X Yosemite

It's that time again; Apple has shipped a new version of OS X, 10.10 Yosemite. Apple ships PHP 5.5.14 with Yosemite and this is how to set it up from a clean install. However, if you don't want to use the built-in PHP or want to use version 5.6, then these are some alternatives: PHP 5.3/5.4/5.5 for OS X 10.6/10.7/10.8/10.9/10.10 as binary package by Liip Homebrew has PHP. Zend Server 7.x (Paid for) Let's get… continue reading.