Saturday, 31 August 2013

Enable and Install cURL in Apache -Ubuntu

apache

This extension for PHP allows for behind the scenes communication between php pages.  This can come in handy if you are needing to communicate or send information between clients and servers.  Following are the steps need to install and test the extension on an Ubuntu Apache web server.

Install Components


sudo apt-get install curl libcurl3 libcurl3-dev php5-curl

Restart the Server


sudo service apache2 restart

Create a test page on the computer to ensure that everything is working.
test.php
<?php
echo '<pre>';
var_dump(curl_version());
echo '</pre>';
?>
browse to the page and make sure there are no errors

Wednesday, 21 August 2013

php tomezone related troubleshooting

Warning: socket_bind() [function.socket-bind]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Calcutta' for 'IST/5.0/no DST' instead in /var/www/chat_php.php on line 19



solution:-

try this
 

date_default_timezone_set('Asia/Calcutta');
 




At beginning your php file.

Friday, 16 August 2013

Laravel Quickstart (PHP framework)

Installation#

To install the Laravel framework, you may issue the following command from your terminal:
composer create-project laravel/laravel your-project-name --prefer-dist
Or, you may also download a copy of the repository from Github. Next, after installing Composer, run the composer install command in the root of your project directory. This command will download and install the framework's dependencies.
After installing the framework, take a glance around the project to familiarize yourself with the directory structure. The app directory contains folders such as views, controllers, and models. Most of your application's code will reside somewhere in this directory. You may also wish to explore the app/config directory and the configuration options that are available to you.

Routing#

To get started, let's create our first route. In Laravel, the simplest route is a route to a Closure. Pop open the app/routes.php file and add the following route to the bottom of the file:
Route::get('users', function()
{
    return 'Users!';
});
Now, if you hit the /users route in your web browser, you should see Users! displayed as the response. Great! You've just created your first route.
Routes can also be attached to controller classes. For example:
Route::get('users', 'UserController@getIndex');
This route informs the framework that requests to the /users route should call the getIndex method on the UserController class. For more information on controller routing, check out the controller documentation.

Creating A View#

Next, we'll create a simple view to display our user data. Views live in the app/views directory and contain the HTML of your application. We're going to place two new views in this directory: layout.blade.php and users.blade.php. First, let's create our layout.blade.php file:
<html>
    <body>
        <h1>Laravel Quickstart</h1>

        @yield('content')
    </body>
</html>
Next, we'll create our users.blade.php view:
@extends('layout')

@section('content')
    Users!
@stop
Some of this syntax probably looks quite strange to you. That's because we're using Laravel's templating system: Blade. Blade is very fast, because it is simply a handful of regular expressions that are run against your templates to compile them to pure PHP. Blade provides powerful functionality like template inheritance, as well as some syntax sugar on typical PHP control structures such as if and for. Check out the Blade documentation for more details.
Now that we have our views, let's return it from our /users route. Instead of returning Users! from the route, return the view instead:
Route::get('users', function()
{
    return View::make('users');
});
Wonderful! Now you have setup a simple view that extends a layout. Next, let's start working on our database layer.

Creating A Migration#

To create a table to hold our data, we'll use the Laravel migration system. Migrations let you expressively define modifications to your database, and easily share them with the rest of your team.
First, let's configure a database connection. You may configure all of your database connections from the app/config/database.php file. By default, Laravel is configured to use MySQL, and you will need to supply connection credentials within the database configuration file. If you wish, you may change the driver option to sqlite and it will use the SQLite database included in the app/database directory.
Next, to create the migration, we'll use the Artisan CLI. From the root of your project, run the following from your terminal:
php artisan migrate:make create_users_table
Next, find the generated migration file in the app/database/migrations folder. This file contains a class with two methods: up and down. In the up method, you should make the desired changes to your database tables, and in the down method you simply reverse them.
Let's define a migration that looks like this:
public function up()
{
    Schema::create('users', function($table)
    {
        $table->increments('id');
        $table->string('email')->unique();
        $table->string('name');
        $table->timestamps();
    });
}

public function down()
{
    Schema::drop('users');
}
Next, we can run our migrations from our terminal using the migrate command. Simply execute this command from the root of your project:
php artisan migrate
If you wish to rollback a migration, you may issue the migrate:rollback command. Now that we have a database table, let's start pulling some data!

Eloquent ORM#

Laravel ships with a superb ORM: Eloquent. If you have used the Ruby on Rails framework, you will find Eloquent familiar, as it follows the ActiveRecord ORM style of database interaction.
First, let's define a model. An Eloquent model can be used to query an associated database table, as well as represent a given row within that table. Don't worry, it will all make sense soon! Models are typically stored in the app/models directory. Let's define a User.php model in that directory like so:
class User extends Eloquent {}
Note that we do not have to tell Eloquent which table to use. Eloquent has a variety of conventions, one of which is to use the plural form of the model name as the model's database table. Convenient!
Using your preferred database administration tool, insert a few rows into your users table, and we'll use Eloquent to retrieve them and pass them to our view.
Now let's modify our /users route to look like this:
Route::get('users', function()
{
    $users = User::all();

    return View::make('users')->with('users', $users);
});
Let's walk through this route. First, the all method on the User model will retrieve all of the rows in the users table. Next, we're passing these records to the view via the with method. The with method accepts a key and a value, and is used to make a piece of data available to a view.
Awesome. Now we're ready to display the users in our view!

Displaying Data#

Now that we have made the users available to our view. We can display them like so:
@extends('layout')

@section('content')
    @foreach($users as $user)
        <p>{{ $user->name }}</p>
    @endforeach
@stop
You may be wondering where to find our echo statements. When using Blade, you may echo data by surrounding it with double curly braces. It's a cinch. Now, you should be able to hit the /users route and see the names of your users displayed in the response.
This is just the beginning. In this tutorial, you've seen the very basics of Laravel, but there are so many more exciting things to learn. Keep reading through the documentation and dig deeper into the powerful features available to you in Eloquent and Blade. Or, maybe you're more interested in Queues and Unit Testing. Then again, maybe you want to flex you

Friday, 9 August 2013

The top 10 most-used PHP features

1. PDO Class

We use the PDO (PHP Data Object) exclusively for connecting to our MySQL databases. PDO provides a nice abstraction layer around a set of database drivers such as MySQL, PostgreSQL and MS SQL. This means that whichever database you are using, as long as PDO supports it, you can use the same functions to perform the same actions on the database. This makes your code more portable for your web application to be used on a whole range of databases with no extra development time.
The PDO Class provides many standardised functions such as creating transactions, creating prepared statements and allowing you to escape your variables if you need to. Used in the correct way, PDO can help protect your web application from SQL injection attacks.
The PDO class can be used directly, but we like to use our own layer over the top to give us more control over things like data entry formatting and validation, which the PDO class does not provide. RedBeanPHP ORM is a good open source solution that provides some nice functionality that's built on top of PDO.
The example below shows a connection to a MySQL database that selects the name, colour and calories from each row in fruit table. By using a prepared statement, PDO converts the placeholders to match the array that is parsed in the execute function. By using the prepared statement, all the values are escaped to protect from SQL injection. The whole piece of code has been added to a try block, which can be used to catch any exceptions.
  1. <?php
  2. try{
  3.     /* Connect to Database */
  4.     $dsn = 'mysql:dbname=test;host=localhost';
  5.     $dbh = new PDO($dsn,'username','password');
  6.  
  7.     /* Create SQL String with parameters */
  8.     $sql = 'SELECT name, colour, calories
  9.    FROM fruit
  10.    WHERE calories < :calories AND colour = :colour';
  11.     $sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  12.     /* add values and execute request on database */
  13.     $sth->execute(array(':calories' => 150, ':colour' => 'red'));
  14.     /* Get the returned Data */
  15.     $dataSet = $sth->fetchAll();
  16.     /* Print Results */
  17.     print_r($dataSet);
  18.  
  19. }catch (PDOException $e){
  20.     echo 'PDO Error: '.$e->getMessage();
  21. }catch(Exception $e){
  22.     echo 'A Unknown Error Occurred: '.$e->getMessage();
  23. }

2. json_encode & json_decode

With the rollout of PHP5.2 came two very useful functions that allow you to parse JSON (JavaScript Object Notation) strings. JSON is a text-based standard that is generally used to send and receive data with a simple structure that was designed to be easily read, both by a computer and by a human.
PHP provides two functions that allow you to manipulate your data both to and from JSON. json_encode is utilised by setting the first argument as your data. Be that a simple string or a multi dimensional array, PHP will try to return a string of your data that has been converted to a JSON formatted string. This string can then be used to output on an API or included in your HTML template to be read by your JavaScript code on the front end.
There are some caveats to using json_encode. For example, only basic data types can be used. Strings, numbers and Booleans are the main types along with associative and non-associative arrays. PHP will also try to convert class objects but will only encode public properties. UTF8 is also used to encode the resulting string of JSON.
The example below shows an array of animals that is converted to a JSON string then sent to the user. You could call this script from an Ajax request via a JavaScript framework which will then return a JavaScript object ready for you to iterate over.
  1. <?php
  2. /* Set Content Encoding Header */
  3. header('Content-type: application/json; charset=utf-8');
  4. /* Array of animals*/
  5. $myArray = array(
  6.     array('type'=>'cat','name'=>'Alfie','age'=>2),
  7.     array('type'=>'dog','name'=>'Bella','age'=>6)
  8. );
  9. /* Encode to JSON */
  10. $jsonString = json_encode($myArray);
  11. echo $jsonString;
json_decode is the opposite of json_encode. The function takes the JSON string as the first argument and tries to parse the string into a PHP variable. There is an optional second argument to convert the string to an object or an associative array. By parsing ‘true’ as the second argument (as shown below) you can return an array.
  1. <?php
  2. /* Set Content Encoding Header */
  3. $json = '[{"type":"cat","name":"Alfie","age":2},{"type":"dog","name":"Bella","age":6}]';
  4. /* Parse JSON to Object */
  5. $object = json_decode($json);
  6. /* Parse JSON to Array */
  7. $array = json_decode($json,true);
  8. /* Print Object */
  9. var_dump($object);
  10. /* Print Array */
  11. var_dump($array);
The advantage of using JSON over XML is its simplicity; with only a few data types PHP makes it very easy to parse simple data. JSON may not be as fast as the XML parsing in the majority of cases, but json_decode provides you with direct access to your data in an array or object format. This is unlike simpleXML, which returns a simpleXML object which you then have to process further to gain access to your data. Consequently, json_decode can be considered to be just as fast.

3. DateTime Class

The DateTime class allows you to manage time and dates in a more object-ordinated way, which is impossible using the standard core functions such as mktime and strtotime. By utilising the DateInterval and DateTimeZone classes, we are able to perform standard functionality like adding or subtracting time intervals on a date or changing the current time zone. The DateTime class can also be extended so we can provide extra functionality whilst making code cleaner and easier to read.
An important reason to use the DateTime class is that it stores all the dates as a 64-bit integer, which provides a workaround for the 32-bit 2038 bug where the dates will cease it increase any further.
The code example below demonstrates how the DateTime Class can be used to add a day to the current server time then convert the time zone to UTC.
  1. <?php
  2. /* Get server time*/
  3. $date = new DateTime();
  4. echo $date->format('Y-m-d H:i:s');
  5. /* Add 1 Day */
  6. $date->add(new DateInterval('P1D'));
  7. echo '<br>'.$date->format('Y-m-d H:i:s');
  8. /* Change Timezone to UTC */
  9. $date->setTimezone(new DateTimeZone('etc/UTC'));
  10. echo '<br>'.$date->format('Y-m-d H:i:s');

4. Exceptions

With PHP5 came the implementation of exceptions. Like other programming languages such as Java and C#, exceptions are used to 'throw' errors that can be caught at any point by bubbling up through your code stack. An exception can be created easily using the throw keyword followed by an Exception object.
Catching exceptions is implemented by wrapping the code you want to test in try block. You will then need to create a catch block to 'catch' any exception that the code in the try block throws.
The PHP interpreter will try and parse everything in the block as usual. If no exception is thrown, then the interpreter will continue down the script ignoring anything in the catch block. However, if an exception is thrown, the rest of the code in the try block is ignored and will execute everything in the catch block.
The beauty of exceptions is that they can be extended as they are just classes. By extending the standard Exception class you can give extra functionality to your exception. Another advantage of extending Exceptions is that it allows you to have multiple catch blocks that can refer to each exception class by utilising type hinting.
With PHP5.5, we are now given a third block called finally. Any code in this area will be run regardless of whether there has been an exception thrown or not.
Like in the PDO example, the example below is contained in a try block. If the script fails to connect for any reason then we are able to capture that by introducing a catch block to capture any PDOExceptions or Exceptions. In the case below any errors will be printed to the screen and the script will still be executed to the end.
  1. <?php
  2. try{
  3.     $dsn = 'mysql:dbname=test;host=localhost';
  4.     $dbh = new PDO($dsn,'username','password');
  5.     echo 'Connected to Database';
  6. }catch (PDOException $e){
  7.     echo 'Connection Failed: '.$e->getMessage();
  8. }catch(Exception $e){
  9.     echo 'A Unknown Error Occurred: '.$e->getMessage();
  10. }
  11. echo 'I am still parsed, even if there was an error';

5. Namespaces

In the times before namespaces, PHP put every variable, function and class under the global namespace. This limited developers to ensure that their applications only had unique function and class names. Developers got round this issue by prefixing class and function names to provide a pseudo effect of namespaces, but the problem with this was that class names could end up being huge, making it sometime hard to read and write them without the use of an intelligent IDE.
Thankfully, with the introduction of namespaces, this problem was resolved. By using the namespace keyword followed by the namespace name at the top of a PHP file, it puts all the code below into that reflective namespace that cannot be accessed by any other namespaces unless explicitly instructed to. With the use of namespaces, we are now able to create well-structured and readable code that's easier to read and manage.
The example below shows how we can implement our own myNamespace namespace and create a new DateTime Class that is completely independent from the standard one provided in the global namespace. Notably, we are able to still use the default standard DateTime class in the namespace by adding a backslash to the front of the name when creating a new instance.
  1. <?php
  2. namespace myNamespace;
  3.  
  4. class DateTime{
  5.     public function customMethod(){
  6.         return 'Fun Times';
  7.     }
  8. }
  9. /*
  10.  * Create a new DateTime object that's in this current namespace
  11.  * If we are outside this namespace we can create it by:  
  12.  *        $customDate = new \myNamespace\DateTime();
  13.  */
  14. $customDate = new DateTime();
  15. echo $customDate->customMethod();
  16. /* We can still create the default DateTime object */
  17. $standardDate = new \DateTime();
  18. echo $standardDate->format('Y-m-d H:i:s');

6. Usort

usort allows the developer to sort an array based on a compare function that's configurable by the developer. This allows you to create more complex sorting algorithms that are not provided by the standard core array sort functions.
The callback/closure function has two parameters, which are two items in the array you have asked to sort on. It's then for you to decide if the first argument is greater, smaller or equal to the second argument. This is done by returning an integer value. Anything smaller than zero will assume the first argument is smaller than the second. Zero means the arguments are equal. Greater than zero means the first argument is larger than the second.
One great application for usort that we tend to use on a daily basis is to sort a simple multi-dimensional array. For example, let's say we have an array of students that consists of an associative array of name and age. By using the usort function along with a callback/closure function, we are able to pick the age and sort by ascending or descending.
For example, the code below is sorting by the age variable for each student in the students array. The callback/closure function provides the algorithm that compares the two ages and decides if the first age is greater than the second.
  1. <?php
  2.  
  3. $successful = usort($students, function  ($a, $b) {
  4.     return $a['age'] - $b['age'];
  5. });

7. Hashing API

There was an issue not too long ago with big-name sites getting hacked and insecure hashed passwords getting stolen. Back in the day, using the MD5 function was sufficient to hash a password, so it was secure. The problem with MD5 and SHA1 is that they are fast to perform the hashing algorithm. Along with the invention of faster processors and the utilisation of GPUs, people have the ability to process many hundreds of thousands of hashes per second, even on a standard desktop computer or laptop.
The new hashing API introduced in PHP5.5 provides an easy-to-use layer on top of bcrypt to create secure (for now) hashes that are a lot harder to solve by hackers. The example below shows how any string variable can be hashed. A salt will be created automatically and the hashing routing will have a cost of 15. The cost will make the hashing more secure but slower to complete.
  1. <?php
  2. $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 20]);

8. SimpleXML Class

When we have to deal with XML files we tend to use the SimpleXML class. This easy-to-use class gives you the ability to read and edit XML files via objects. Using these objects gives you the ability to return values and iterate over arrays in the usual ways, as well as a set of simple methods to modify the XML’s structure. If you just need to grab something specific in the XML then using the built-in method of XPath, you can return a set of SimpleXML Element objects for just the path that you provided.
As well as reading XML, SimpleXML also provides the methods to create new documents and/or inject elements back into the imported XML. This can then be saved all in a few lines of code.
The SimpleXML class is provided as a standard extension for PHP. Although it’s not in the core of PHP, it is enabled by default.
The example below shows a very simple example to get a list of public photos from Flickr and display the content html of each photo.
  1. <?php
  2. /* Load flickr Public Feed */
  3. $xml = simplexml_load_file('http://api.flickr.com/services/feeds/photos_public.gne');
  4. if(is_object($xml)){
  5.     /* Get each entry and echo the content tag */
  6.     foreach($xml->entry as $photo) echo $photo->content;
  7. }

9. glob

The glob function provides an easy one-line solution for creating an array of path names using a pattern you provide. glob may not be as fast as using the opendir and readdir combination, but if you just want to iterate over a directory, or you’re searching for a specific file type such as an image, then using glob could be a good solution to your problem.
The first argument is a glob pattern string that's similar to a regular expression in the way that it functions, but the syntax to create the pattern has some differences. This allows you to search for a varied subset of files and folders that are contained in a directory.
One big disadvantage of using glob is that all the results are stored into memory in one go. If you have a very large folder full of files you can soon run out of memory, and in this instance, it would be better to use opendir and readdir as it creates a read stream buffer.
Using the example below we are able to return all the image files in the $imagePath directory. An array will be returned to the $images variable.
  1. <?php
  2. /* Find all image files in image folder */
  3. $images = glob($imagePath.'*.{gif,jpeg,jpg,png}',GLOB_BRACE);

10. array_map

The standard core functions that PHP provide tend to perform faster, than creating your own similar functions using PHP code. A great example of this is utilising array_map instead of creating a for or which loop. array_map allows you to create a function called a callback that will be applied to every item in an array you supply.
For example, if you had an array of lowercase letters, a callback function can be created to uppercase all the characters in the array. On a small-sized array, the speed increase would be quite small, but once you start using larger arrays, you can really see a significant difference in speed.
In the example below we are converting the alphabet from lowercase to uppercase. We have provided the array_map function with a string of the name of the function we want to process. In this case we are using strtoupper to convert each letter in the array.

If there’s a need for more complex functionality, we can also provide the array_map function, a closure like in the usort example above.
  1. <?php
  2. $alphabet=array();
  3. /* Create lower Case Alphabet */
  4. for($i=97;$i<123;$i++) $alphabet[]=chr($i);
  5. /* Convert to Uppercase */
  6. $upperCaseAlphabet = array_map('strtoupper',$alphabet);

Expert badge

There are endless possibilities with PHP, but it’s not until you fully grasp the base features covered in this article that you fully begin to earn your PHP expert badge. It can be a long and steep learning curve but it’s a worthwhile one. PHP forms the foundations of so much of our work at Ecce Media, from building bespoke platforms and ecommerce systems, to content management systems and so much more. In the world of web development, every day brings a new challenge and armed with PHP and our top tips, you’ll be in prime position to tackle them.

Thursday, 8 August 2013

natsort : natural sort for array

natsort

(PHP 4, PHP 5)
natsortSort an array using a "natural order" algorithm

reject note Description

bool natsort ( array &$array )
This function implements a sort algorithm that orders alphanumeric strings in the way a human being would while maintaining key/value associations. This is described as a "natural ordering". An example of the difference between this algorithm and the regular computer string sorting algorithms (used in sort()) can be seen in the example below.

reject note Parameters

array
The input array.

reject note Return Values

Returns TRUE on success or FALSE on failure. 

Example #1 natsort() examples demonstrating basic usage
<?php
$array1 
$array2 = array("img12.png""img10.png""img2.png""img1.png");
asort($array1);
echo 
"Standard sorting\n";print_r($array1);
natsort($array2);
echo 
"\nNatural order sorting\n";print_r($array2);?>
The above example will output:
Standard sorting
Array
(
    [3] => img1.png
    [1] => img10.png
    [0] => img12.png
    [2] => img2.png
)

Natural order sorting
Array
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)

Sorting Arrays

PHP has several functions that deal with sorting arrays, and this document exists to help sort it all out.
The main differences are:
  • Some sort based on the array keys, whereas others by the values: $array['key'] = 'value';
  • Whether or not the correlation between the keys and values are maintained after the sort, which may mean the keys are reset numerically (0,1,2 ...)
  • The order of the sort: alphabetical, low to high (ascending), high to low (descending), numerical, natural, random, or user defined
  • Note: All of these sort functions act directly on the array variable itself, as opposed to returning a new sorted array
  • If any of these sort functions evaluates two members as equal then the order is undefined (the sorting is not stable).
Sorting function attributes
Function name Sorts by Maintains key association Order of sort Related functions
array_multisort() value associative yes, numeric no first array or sort options array_walk()
asort() value yes low to high arsort()
arsort() value yes high to low asort()
krsort() key yes high to low ksort()
ksort() key yes low to high asort()
natcasesort() value yes natural, case insensitive natsort()
natsort() value yes natural natcasesort()
rsort() value no high to low sort()
shuffle() value no random array_rand()
sort() value no low to high rsort()
uasort() value yes user defined uksort()
uksort() key yes user defined uasort()
usort() value no user defined uasort()

Wednesday, 7 August 2013

17 useful functions for manipulating arrays in PHP

This document outlines some of the more useful functions in the PHP array toolkit, and features detailed explanations and usage examples.
Like arrays in other languages, PHP arrays allow you to store multiple values in a single variable and operate on them as a set. PHP offers an extensive array manipulation toolkit—over 60 functions—that lets you process arrays in almost any way imaginable including reversing them, extracting subsets, comparing and sorting, recursively processing, and searching them for specific values.
This document outlines some of the more useful functions in the PHP array toolkit, with explanations and usage examples:

This table is also available as free downloadable PDF.


Function
Explanation
Example
sizeof($arr)
This function returns the number of elements in an array.
Use this function to find out how many elements an array contains; this information is most commonly used to initialize a loop counter when processing the array.
Code:
$data = array("red", "green", "blue");

echo "Array has " . sizeof($data) . " elements";
?>

Output:
Array has 3 elements
array_values($arr)
This function accepts a PHP array and returns a new array containing only its values (not its keys). Its counterpart is the array_keys() function.
Use this function to retrieve all the values from an associative array.
Code:
$data = array("hero" => "Holmes", "villain" => "Moriarty");
print_r(array_values($data));
?>

Output:
Array
(
[0] => Holmes
[1] => Moriarty
)
array_keys($arr)
This function accepts a PHP array and returns a new array containing only its keys (not its values). Its counterpart is the array_values() function.
Use this function to retrieve all the keys from an associative array.
Code:
$data = array("hero" => "Holmes", "villain" => "Moriarty");
print_r(array_keys($data));
?>

Output:
Array
(
[0] => hero
[1] => villain
)
array_pop($arr)
This function removes an element from the end of an array.
Code:
$data = array("Donald", "Jim", "Tom");
array_pop($data);
print_r($data);
?>

Output:
Array
(
[0] => Donald
[1] => Jim
)
array_push($arr, $val)
This function adds an element to the end of an array.
Code:
$data = array("Donald", "Jim", "Tom");
array_push($data, "Harry");
print_r($data);
?>

Output:
Array
(
[0] => Donald
[1] => Jim
[2] => Tom
[3] => Harry
)
array_shift($arr)
This function removes an element from the beginning of an array.
Code:
$data = array("Donald", "Jim", "Tom");
array_shift($data);
print_r($data);
?>

Output:
Array
(
[0] => Jim
[1] => Tom
)
array_unshift($arr, $val)
This function adds an element to the beginning of an array.
Code:
$data = array("Donald", "Jim", "Tom");
array_unshift($data, "Sarah");
print_r($data);
?>

Output:
Array
(
[0] => Sarah
[1] => Donald
[2] => Jim
[3] => Tom
)
each($arr)
This function is most often used to iteratively traverse an array. Each time each() is called, it returns the current key-value pair and moves the array cursor forward one element. This makes it most suitable for use in a loop.
Code:
$data = array("hero" => "Holmes", "villain" => "Moriarty");
while (list($key, $value) = each($data)) {
echo "$key: $value \n";
}
?>

Output:
hero: Holmes
villain: Moriarty
sort($arr)
This function sorts the elements of an array in ascending order. String values will be arranged in ascending alphabetical order.
Note: Other sorting functions include asort(), arsort(), ksort(), krsort() and rsort().
Code:
$data = array("g", "t", "a", "s");
sort($data);
print_r($data);
?>

Output:
Array
(
[0] => a
[1] => g
[2] => s
[3] => t
)
array_flip($arr)
The function exchanges the keys and values of a PHP associative array.
Use this function if you have a tabular (rows and columns) structure in an array, and you want to interchange the rows and columns.
Code:
$data = array("a" => "apple", "b" => "ball");
print_r(array_flip($data));
?>

Output:
Array
(
[apple] => a
[ball] => b
)
array_reverse($arr)
The function reverses the order of elements in an array.
Use this function to re-order a sorted list of values in reverse for easier processing—for example, when you're trying to begin with the minimum or maximum of a set of ordered values.
Code:
$data = array(10, 20, 25, 60);
print_r(array_reverse($data));
?>

Output:
Array
(
[0] => 60
[1] => 25
[2] => 20
[3] => 10
)
array_merge($arr)
This function merges two or more arrays to create a single composite array. Key collisions are resolved in favor of the latest entry.
Use this function when you need to combine data from two or more arrays into a single structure—for example, records from two different SQL queries.
Code:
$data1 = array("cat", "goat");
$data2 = array("dog", "cow");
print_r(array_merge($data1, $data2));
?>

Output:
Array
(
[0] => cat
[1] => goat
[2] => dog
[3] => cow
)
array_rand($arr)
This function selects one or more random elements from an array.
Use this function when you need to randomly select from a collection of discrete values—for example, picking a random color from a list.
Code:
$data = array("white", "black", "red");
echo "Today's color is " . $data[array_rand($data)];
?>

Output:
Today's color is red
array_search($search, $arr)
This function searches the values in an array for a match to the search term, and returns the corresponding key if found. If more than one match exists, the key of the first matching value is returned.
Use this function to scan a set of index-value pairs for matches, and return the matching index.
Code:
$data = array("blue" => "#0000cc", "black" => "#000000", "green" => "#00ff00");
echo "Found " . array_search("#0000cc", $data);
?>

Output:
Found blue
array_slice($arr, $offset, $length)
This function is useful to extract a subset of the elements of an array, as another array. Extracting begins from array offset $offset and continues until the array slice is $length elements long.
Use this function to break a larger array into smaller ones—for example, when segmenting an array by size ("chunking") or type of data.
Code:
$data = array("vanilla", "strawberry", "mango", "peaches");
print_r(array_slice($data, 1, 2));
?>

Output:
Array
(
[0] => strawberry
[1] => mango
)
array_unique($data)
This function strips an array of duplicate values.
Use this function when you need to remove non-unique elements from an array—for example, when creating an array to hold values for a table's primary key.
Code:
$data = array(1,1,4,6,7,4);
print_r(array_unique($data));
?>

Output:
Array
(
[0] => 1
[3] => 6
[4] => 7
[5] => 4
)
array_walk($arr, $func)
This function "walks" through an array, applying a user-defined function to every element. It returns the changed array.
Use this function if you need to perform custom processing on every element of an array—for example, reducing a number series by 10%.
Code:
function reduceBy10(&$val, $key) {
$val -= $val * 0.1;
}

$data = array(10,20,30,40);
array_walk($data, 'reduceBy10');
print_r($data);
?>

Output:
Array
(
[0] => 9
[1] => 18
[2] => 27
[3] => 36
)

9 Useful PHP Functions and Features You Need to Know

Even after using PHP for years, we stumble upon functions and features that we did not know about. Some of these can be quite useful, yet underused. With that in mind, I’ve compiled a list of nine incredibly useful PHP functions and features that you should be familiar with.

1. Functions with Arbitrary Number of Arguments

You may already know that PHP allows you to define functions with optional arguments. But there is also a method for allowing completely arbitrary number of function arguments.
First, here is an example with just optional arguments:
  1. // function with 2 optional arguments  
  2. function foo($arg1 = ''$arg2 = '') {  
  3.   
  4.     echo "arg1: $arg1\n";  
  5.     echo "arg2: $arg2\n";  
  6.   
  7. }  
  8. foo('hello','world');  
  9. /* prints: 
  10. arg1: hello 
  11. arg2: world 
  12. */  
  13.   
  14. foo();  
  15. /* prints: 
  16. arg1: 
  17. arg2: 
  18. */  
Now, let’s see how we can build a function that accepts any number of arguments. This time we are going to utilize func_get_args():
  1. // yes, the argument list can be empty  
  2. function foo() {  
  3.   
  4.     // returns an array of all passed arguments  
  5.     $args = func_get_args();  
  6.   
  7.     foreach ($args as $k => $v) {  
  8.         echo "arg".($k+1).": $v\n";  
  9.     }  
  10.   
  11. }  
  12.   
  13. foo();  
  14. /* prints nothing */  
  15.   
  16. foo('hello');  
  17. /* prints 
  18. arg1: hello 
  19. */  
  20.   
  21. foo('hello''world''again');  
  22. /* prints 
  23. arg1: hello 
  24. arg2: world 
  25. arg3: again 
  26. */  

2. Using Glob() to Find Files

Many PHP functions have long and descriptive names. However it may be hard to tell what a function named glob() does unless you are already familiar with that term from elsewhere.
Think of it like a more capable version of the scandir() function. It can let you search for files by using patterns.
  1. // get all php files  
  2. $files = glob('*.php');  
  3.   
  4. print_r($files);  
  5. /* output looks like: 
  6. Array 
  7. ( 
  8.     [0] => phptest.php 
  9.     [1] => pi.php 
  10.     [2] => post_output.php 
  11.     [3] => test.php 
  12. ) 
  13. */  
You can fetch multiple file types like this:
  1. // get all php files AND txt files  
  2. $files = glob('*.{php,txt}', GLOB_BRACE);  
  3.   
  4. print_r($files);  
  5. /* output looks like: 
  6. Array 
  7. ( 
  8.     [0] => phptest.php 
  9.     [1] => pi.php 
  10.     [2] => post_output.php 
  11.     [3] => test.php 
  12.     [4] => log.txt 
  13.     [5] => test.txt 
  14. ) 
  15. */  
Note that the files can actually be returned with a path, depending on your query:
  1. $files = glob('../images/a*.jpg');  
  2.   
  3. print_r($files);  
  4. /* output looks like: 
  5. Array 
  6. ( 
  7.     [0] => ../images/apple.jpg 
  8.     [1] => ../images/art.jpg 
  9. ) 
  10. */  
If you want to get the full path to each file, you can just call the realpath() function on the returned values:
  1. $files = glob('../images/a*.jpg');  
  2.   
  3. // applies the function to each array element  
  4. $files = array_map('realpath',$files);  
  5.   
  6. print_r($files);  
  7. /* output looks like: 
  8. Array 
  9. ( 
  10.     [0] => C:\wamp\www\images\apple.jpg 
  11.     [1] => C:\wamp\www\images\art.jpg 
  12. ) 
  13. */  

3. Memory Usage Information

By observing the memory usage of your scripts, you may be able optimize your code better.
PHP has a garbage collector and a pretty complex memory manager. The amount of memory being used by your script. can go up and down during the execution of a script. To get the current memory usage, we can use the memory_get_usage() function, and to get the highest amount of memory used at any point, we can use the memory_get_peak_usage() function.
  1. echo "Initial: ".memory_get_usage()." bytes \n";  
  2. /* prints 
  3. Initial: 361400 bytes 
  4. */  
  5.   
  6. // let's use up some memory  
  7. for ($i = 0; $i < 100000; $i++) {  
  8.     $array []= md5($i);  
  9. }  
  10.   
  11. // let's remove half of the array  
  12. for ($i = 0; $i < 100000; $i++) {  
  13.     unset($array[$i]);  
  14. }  
  15.   
  16. echo "Final: ".memory_get_usage()." bytes \n";  
  17. /* prints 
  18. Final: 885912 bytes 
  19. */  
  20.   
  21. echo "Peak: ".memory_get_peak_usage()." bytes \n";  
  22. /* prints 
  23. Peak: 13687072 bytes 
  24. */  

4. CPU Usage Information

For this, we are going to utilize the getrusage() function. Keep in mind that this is not available on Windows platforms.
  1. print_r(getrusage());  
  2. /* prints 
  3. Array 
  4. ( 
  5.     [ru_oublock] => 0 
  6.     [ru_inblock] => 0 
  7.     [ru_msgsnd] => 2 
  8.     [ru_msgrcv] => 3 
  9.     [ru_maxrss] => 12692 
  10.     [ru_ixrss] => 764 
  11.     [ru_idrss] => 3864 
  12.     [ru_minflt] => 94 
  13.     [ru_majflt] => 0 
  14.     [ru_nsignals] => 1 
  15.     [ru_nvcsw] => 67 
  16.     [ru_nivcsw] => 4 
  17.     [ru_nswap] => 0 
  18.     [ru_utime.tv_usec] => 0 
  19.     [ru_utime.tv_sec] => 0 
  20.     [ru_stime.tv_usec] => 6269 
  21.     [ru_stime.tv_sec] => 0 
  22. ) 
  23.  
  24. */  
That may look a bit cryptic unless you already have a system administration background. Here is the explanation of each value (you don't need to memorize these):
  • ru_oublock: block output operations
  • ru_inblock: block input operations
  • ru_msgsnd: messages sent
  • ru_msgrcv: messages received
  • ru_maxrss: maximum resident set size
  • ru_ixrss: integral shared memory size
  • ru_idrss: integral unshared data size
  • ru_minflt: page reclaims
  • ru_majflt: page faults
  • ru_nsignals: signals received
  • ru_nvcsw: voluntary context switches
  • ru_nivcsw: involuntary context switches
  • ru_nswap: swaps
  • ru_utime.tv_usec: user time used (microseconds)
  • ru_utime.tv_sec: user time used (seconds)
  • ru_stime.tv_usec: system time used (microseconds)
  • ru_stime.tv_sec: system time used (seconds)
To see how much CPU power the script has consumed, we need to look at the 'user time' and 'system time' values. The seconds and microseconds portions are provided separately by default. You can divide the microseconds value by 1 million, and add it to the seconds value, to get the total seconds as a decimal number.
Let's see an example:
  1. // sleep for 3 seconds (non-busy)  
  2. sleep(3);  
  3.   
  4. $data = getrusage();  
  5. echo "User time: ".  
  6.     ($data['ru_utime.tv_sec'] +  
  7.     $data['ru_utime.tv_usec'] / 1000000);  
  8. echo "System time: ".  
  9.     ($data['ru_stime.tv_sec'] +  
  10.     $data['ru_stime.tv_usec'] / 1000000);  
  11.   
  12. /* prints 
  13. User time: 0.011552 
  14. System time: 0 
  15. */  
Even though the script took about 3 seconds to run, the CPU usage was very very low. Because during the sleep operation, the script actually does not consume CPU resources. There are many other tasks that may take real time, but may not use CPU time, like waiting for disk operations. So as you see, the CPU usage and the actual length of the runtime are not always the same.
Here is another example:
  1. // loop 10 million times (busy)  
  2. for($i=0;$i<10000000;$i++) {  
  3.   
  4. }  
  5.   
  6. $data = getrusage();  
  7. echo "User time: ".  
  8.     ($data['ru_utime.tv_sec'] +  
  9.     $data['ru_utime.tv_usec'] / 1000000);  
  10. echo "System time: ".  
  11.     ($data['ru_stime.tv_sec'] +  
  12.     $data['ru_stime.tv_usec'] / 1000000);  
  13.   
  14. /* prints 
  15. User time: 1.424592 
  16. System time: 0.004204 
  17. */  
That took about 1.4 seconds of CPU time, almost all of which was user time, since there were no system calls.
System Time is the amount of time the CPU spends performing system calls for the kernel on the program's behalf. Here is an example of that:
  1. $start = microtime(true);  
  2. // keep calling microtime for about 3 seconds  
  3. while(microtime(true) - $start < 3) {  
  4.   
  5. }  
  6.   
  7. $data = getrusage();  
  8. echo "User time: ".  
  9.     ($data['ru_utime.tv_sec'] +  
  10.     $data['ru_utime.tv_usec'] / 1000000);  
  11. echo "System time: ".  
  12.     ($data['ru_stime.tv_sec'] +  
  13.     $data['ru_stime.tv_usec'] / 1000000);  
  14.   
  15. /* prints 
  16. User time: 1.088171 
  17. System time: 1.675315 
  18. */  
Now we have quite a bit of system time usage. This is because the script calls the microtime() function many times, which performs a request through the operating system to fetch the time.
Also you may notice the numbers do not quite add up to 3 seconds. This is because there were probably other processes on the server as well, and the script was not using 100% CPU for the whole duration of the 3 seconds.

5. Magic Constants

PHP provides useful magic constants for fetching the current line number (__LINE__), file path (__FILE__), directory path (__DIR__), function name (__FUNCTION__), class name (__CLASS__), method name (__METHOD__) and namespace (__NAMESPACE__).
We are not going to cover each one of these in this article, but I will show you a few use cases.
When including other scripts, it is a good idea to utilize the __FILE__ constant (or also __DIR__ , as of PHP 5.3):
  1. // this is relative to the loaded script's path  
  2. // it may cause problems when running scripts from different directories  
  3. require_once('config/database.php'); 
  4.  
  5. // this is always relative to this file's path  
  6. // no matter where it was included from  
  7. require_once(dirname(__FILE__) . '/config/database.php');  
Using __LINE__ makes debugging easier. You can track down the line numbers:
  1. // some code  
  2. // ...  
  3. my_debug("some debug message"__LINE__);  
  4. /* prints 
  5. Line 4: some debug message 
  6. */  
  7.   
  8. // some more code  
  9. // ...  
  10. my_debug("another debug message"__LINE__);  
  11. /* prints 
  12. Line 11: another debug message 
  13. */  
  14.   
  15. function my_debug($msg$line) {  
  16.     echo "Line $line: $msg\n";  
  17. }  

6. Generating Unique ID's

There may be situations where you need to generate a unique string. I have seen many people use the md5() function for this, even though it's not exactly meant for this purpose:
  1. // generate unique string  
  2. echo md5(time() . mt_rand(1,1000000));  
There is actually a PHP function named uniqid() that is meant to be used for this.
  1. // generate unique string  
  2. echo uniqid();  
  3. /* prints 
  4. 4bd67c947233e 
  5. */  
  6.   
  7. // generate another unique string  
  8. echo uniqid();  
  9. /* prints 
  10. 4bd67c9472340 
  11. */  
You may notice that even though the strings are unique, they seem similar for the first several characters. This is because the generated string is related to the server time. This actually has a nice side effect, as every new generated id comes later in alphabetical order, so they can be sorted.
To reduce the chances of getting a duplicate, you can pass a prefix, or the second parameter to increase entropy:
  1. // with prefix  
  2. echo uniqid('foo_');  
  3. /* prints 
  4. foo_4bd67d6cd8b8f 
  5. */  
  6.   
  7. // with more entropy  
  8. echo uniqid('',true);  
  9. /* prints 
  10. 4bd67d6cd8b926.12135106 
  11. */  
  12.   
  13. // both  
  14. echo uniqid('bar_',true);  
  15. /* prints 
  16. bar_4bd67da367b650.43684647 
  17. */  
This function will generate shorter strings than md5(), which will also save you some space.

7. Serialization

Have you ever needed to store a complex variable in a database or a text file? You do not have to come up with a fancy solution to convert your arrays or objects into formatted strings, as PHP already has functions for this purpose.
There are two popular methods of serializing variables. Here is an example that uses the serialize() and unserialize():
  1. // a complex array  
  2. $myvar = array(  
  3.     'hello',  
  4.     42,  
  5.     array(1,'two'),  
  6.     'apple'  
  7. );  
  8.   
  9. // convert to a string  
  10. $string = serialize($myvar);  
  11.   
  12. echo $string;  
  13. /* prints 
  14. a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} 
  15. */  
  16.   
  17. // you can reproduce the original variable  
  18. $newvar = unserialize($string);  
  19.   
  20. print_r($newvar);  
  21. /* prints 
  22. Array 
  23. ( 
  24.     [0] => hello 
  25.     [1] => 42 
  26.     [2] => Array 
  27.         ( 
  28.             [0] => 1 
  29.             [1] => two 
  30.         ) 
  31.  
  32.     [3] => apple 
  33. ) 
  34. */  
This was the native PHP serialization method. However, since JSON has become so popular in recent years, they decided to add support for it in PHP 5.2. Now you can use the json_encode() and json_decode() functions as well:
  1. // a complex array  
  2. $myvar = array(  
  3.     'hello',  
  4.     42,  
  5.     array(1,'two'),  
  6.     'apple'  
  7. );  
  8.   
  9. // convert to a string  
  10. $string = json_encode($myvar);  
  11.   
  12. echo $string;  
  13. /* prints 
  14. ["hello",42,[1,"two"],"apple"] 
  15. */  
  16.   
  17. // you can reproduce the original variable  
  18. $newvar = json_decode($string);  
  19.   
  20. print_r($newvar);  
  21. /* prints 
  22. Array 
  23. ( 
  24.     [0] => hello 
  25.     [1] => 42 
  26.     [2] => Array 
  27.         ( 
  28.             [0] => 1 
  29.             [1] => two 
  30.         ) 
  31.  
  32.     [3] => apple 
  33. ) 
  34. */  
It is more compact, and best of all, compatible with javascript and many other languages. However, for complex objects, some information may be lost.

8. Compressing Strings

When talking about compression, we usually think about files, such as ZIP archives. It is possible to compress long strings in PHP, without involving any archive files.
In the following example we are going to utilize the gzcompress() and gzuncompress() functions:
  1. $string =  
  2. "Lorem ipsum dolor sit amet, consectetur 
  3. adipiscing elit. Nunc ut elit id mi ultricies 
  4. adipiscing. Nulla facilisi. Praesent pulvinar, 
  5. sapien vel feugiat vestibulum, nulla dui pretium orci, 
  6. non ultricies elit lacus quis ante. Lorem ipsum dolor 
  7. sit amet, consectetur adipiscing elit. Aliquam 
  8. pretium ullamcorper urna quis iaculis. Etiam ac massa 
  9. sed turpis tempor luctus. Curabitur sed nibh eu elit 
  10. mollis congue. Praesent ipsum diam, consectetur vitae 
  11. ornare a, aliquam a nunc. In id magna pellentesque 
  12. tellus posuere adipiscing. Sed non mi metus, at lacinia 
  13. augue. Sed magna nisi, ornare in mollis in, mollis 
  14. sed nunc. Etiam at justo in leo congue mollis. 
  15. Nullam in neque eget metus hendrerit scelerisque 
  16. eu non enim. Ut malesuada lacus eu nulla bibendum 
  17. id euismod urna sodales. ";  
  18.   
  19. $compressed = gzcompress($string);  
  20.   
  21. echo "Original size: "strlen($string)."\n";  
  22. /* prints 
  23. Original size: 800 
  24. */  
  25. echo "Compressed size: "strlen($compressed)."\n";  
  26. /* prints 
  27. Compressed size: 418 
  28. */  
  29.   
  30. // getting it back  
  31. $original = gzuncompress($compressed);  
We were able to achive almost 50% size reduction. Also the functions gzencode() and gzdecode() achive similar results, by using a different compression algorithm.

9. Register Shutdown Function

There is a function called register_shutdown_function(), which will let you execute some code right before the script finishes running.
Imagine that you want to capture some benchmark statistics at the end of your script execution, such as how long it took to run:
  1. // capture the start time  
  2. $start_time = microtime(true);  
  3.   
  4. // do some stuff  
  5. // ...  
  6.   
  7. // display how long the script took  
  8. echo "execution took: ".  
  9.         (microtime(true) - $start_time).  
  10.         " seconds.";  
At first this may seem trivial. You just add the code to the very bottom of the script and it runs before it finishes. However, if you ever call the exit() function, that code will never run. Also, if there is a fatal error, or if the script is terminated by the user (by pressing the Stop button in the browser), again it may not run.
When you use register_shutdown_function(), your code will execute no matter why the script has stopped running:
  1. $start_time = microtime(true);  
  2.   
  3. register_shutdown_function('my_shutdown');  
  4.   
  5. // do some stuff  
  6. // ...  
  7. function my_shutdown() {  
  8.     global $start_time;  
  9.   
  10.     echo "execution took: ".  
  11.             (microtime(true) - $start_time).  
  12.             " seconds.";  
  13. }  

Conclusion

Are you aware of any other PHP features that are not widely known but can be quite useful? Please share with us in the comments. And thank you for reading!