Sorting second dimension array

We can sort the second dimension array like table, for example


$users = array(
	array('name' => 'Mr. B', 'age' => 34), 
	array('name' => 'Mr. A', 'age' => 33),
	array('name' => 'Mr. C', 'age' => 32)
);

If you want to sort the array based on the name or age, here is the solution:



function arraySortByColumn(&$arr, $col, $dir = SORT_ASC){
	$sort_col = array();
	foreach ($arr as $key => $row) {
		$sort_col[$key] = $row[$col];
	}
	array_multisort($sort_col, $dir, $arr);
}

arraySortByColumn($users, 'name', SORT_DESC);
print_r($users);

Connect MySQL Remotely, Amazon EC2 using MySQL Workbench

Login to AWS Management Console. Under the security group, add inbound rule for MySQL.

First login to EC2 instance using SSH, then login to mysql 
mysql -hlocalhost -uroot -p
provide the password. Once you are in mysql prompt
CREATE USER 'testuser'@'%' IDENTIFIED BY 'testpwd'
GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%' WITH GRANT OPTION
FLUSH PRIVILEGES
Note: Setting host to '%' may be harmful, you can set your IP address to access the MySQL from your IP address only

Now open the my.cnf file from /etc/mysql and search for bind-address, the default value will be
bind-address = 127.0.0.1
change it to
 bind-address = 0.0.0.0
That's it now go to MySQL workbench, create connection with
Host:
Username: testuser
 

MySQL Simple JOINS



Simple Example: Lets say you have a Students table, and a Lockers table.
Each student can be assigned to a locker, so there is a "Locker Number" column in the student table. More than one student could potentially be in a single locker, but especially at the beginning of the school year, you may have some incoming students without lockers and some lockers that have no students assigned.
For the sake of this example, lets say you have 100 students, 70 of which have lockers. You have a total of 50 lockers, 40 of which have at least 1 student and 10 lockers have no student.
INNER JOIN is equivalent to "show me all students with lockers".
Any students without lockers, or any lockers without students are missing.
Returns 70 rows
LEFT OUTER JOIN would be "show me all students, with their corresponding locker if they have one".
This might be a general student list, or could be used to identify students with no locker.
Returns 100 rows
RIGHT OUTER JOIN would be "show me all lockers, and the students assigned to them if there are any".
This could be used to identify lockers that have no students assigned, or lockers that have too many students.
Returns 80 rows (list of 70 students in the 40 lockers, plus the 10 lockers with no student)
FULL OUTER JOIN would be silly and probably not much use.
Something like "show me all students and all lockers, and match them up where you can"
Returns 110 rows (all 100 students, including those without lockers. Plus the 10 lockers with no student)
CROSS JOIN is also fairly silly in this scenario.
It doesn't use the linked "locker number" field in the students table, so you basically end up with a big giant list of every possible student-to-locker pairing, whether or not it actually exists.
Returns 5000 rows (100 students x 50 lockers). Could be useful (with filtering) as a starting point to match up the new students with the empty lockers.
Original here

Find relative duration of an event using PHP for given date time (seconds ago, minutes ago, hours ago, days ago, weeks ago, months ago, years ago)

You might have seen that many of the live applications shows the time relative to when it was posted as seconds ago, minutes ago, hours ago, days ago, weeks ago, month ago, year ago and so on. Instead of showing the whole date and time of any possible action on the application it is shown with smaller units, more simpler ones like a minute ago, 15 minutes and 10 seconds ago etc. Here is how we achieve it using PHP, below are two methods that can be used, it requires a Date Time string in YYYY-MM-DD HH:II:SS format.


Method One:

  /**
     * returns the time ago in string
     * @param string $date_time
     *
     * @return string
     */
    function timeAgo($date_time)
    {
        $time_ago = strtotime($date_time);
        $cur_time = time();
        $time_elapsed = $cur_time - $time_ago;
        $seconds = $time_elapsed;
        $minutes = round($time_elapsed / 60);
        $hours = round($time_elapsed / 3600);
        $days = round($time_elapsed / 86400);
        $weeks = round($time_elapsed / 604800);
        $months = round($time_elapsed / 2600640);
        $years = round($time_elapsed / 31207680);
        $str = ''; // Seconds
        if ($seconds <= 60) {
            $str = "few seconds ago";
        } // Minuteselse
        if ($minutes <= 60) {
            if ($minutes == 1) {
                $str = "one minute ago";
            } else {
                $str = "$minutes minutes ago";
            }
        } // Hours
        else if ($hours <= 24) {
            if ($hours == 1) {
                $str = "an hour ago";
            } else {
                $str = "$hours hours ago";
            }
        } // Days
        else if ($days <= 7) {
            if ($days == 1) {
                $str = "yesterday";
            } else {
                $str = "$days days ago";
            }
        } // Weeks
        else if ($weeks <= 4.3) {
            if ($weeks == 1) {
                $str = "a week ago";
            } else {
                $str = "$weeks weeks ago";
            }
        } // Months
        else if ($months <= 12) {
            if ($months == 1) {
                $str = "a month ago";
            } else {
                $str = "$months months ago";
            }
        } // Years
        else {
            if ($years == 1) {
                $str = "one year ago";
            } else {
                $str = "$years years ago";
            }
        }
        return $str;
    }
ex:
echo timeAgo('2015-01-17 14:20:00'); 
o/p: 31 minutes ago

Method Two: in detail

  /**
     * gives time ago in detailed
     *
     * @param string $date_time
     * @return string
     */
    function timeAgo($date_time)
    {
        $then = new DateTime($date_time);
        $now = new DateTime();
        $delta = $now->diff($then);
        $quantities = array(
            'year' => $delta->y,
            'month' => $delta->m,
            'day' => $delta->d,
            'hour' => $delta->h,
            'minute' => $delta->i,
            'second' => $delta->s
        );
        $str = '';
        foreach ($quantities as $unit => $value) {
            if ($value == 0)
                continue;
            $str .= $value . ' ' . $unit;
            if ($value != 1) {
                $str .= 's';
            }
            $str .= ', ';
        }
        $str = $str == '' ? 'a moment ' : substr($str, 0, - 2);
        return $str . ' ago';
    }
    
ex:
echo timeAgo('2015-01-17 14:20:00'); 
o/p: 31 minutes, 14 seconds ago

Recovering an InnoDB table from only an .ibd file

Sometime you may need to recover a table when all you have is the .ibd file. In this case, if you try to load it into a new instance, your likely to encounter some errors about the table id not matching. And there is not really a way around this.
However, I’ve found two work-arounds for this:
Note: You will need the .ibd file and the CREATE TABLE statement for each table you want to recover using these methods.
  1. Simulate the internal InnoDB table counter. That is, create work tables (with innodb_file_per_table enabled) until you have the internal pointer of table id equal to (1 – id_of_ibd_table_you_need_to_restore). (See Method #1)
  2. Manually hex edit the .ibd file, changing the table id. (See Method #2)
*Note: There are some internal structures with this meta information, so you’ll need to dump/import that data after you get it loaded, so you avoid unpleasantries that will inevitably show their face.
Method #1 – Create work tables
  1. Start up clean/fresh instance of MySQL with innodb_file_per_table enabled. 
  2. Now, we need to find the table id that MySQL is currently set at, as well as the table id for the table we need to recover. Note:  Step 2 (2a – 2f) is simply to find the table id that is stored inside of the .ibd file. I’ve written a PHP script to determine this, so using the script can save a bunch of time. See the bottom of this page (under “Associated Files”) for the exact script.
    2a. Create a test database:
    mysql> CREATE DATABASE test1;
    mysql> USE test1;
    
    2b. Issue the create table command for the table:
    mysql> CREATE TABLE `product` (
      `PRODUCT_ID` bigint(20) unsigned NOT NULL auto_increment,
      `BRAND_ID` int(10) unsigned default NULL,
      `PRODUCT_TYPE_ID` int(10) unsigned default NULL,
      `GROUP_ID` int(10) unsigned default NULL,
      `PRODUCT_NAME` varchar(500) NOT NULL,
      `DEFAULT_EMAIL_ID` varchar(48) default NULL,
      `PRODUCT_STATUS` tinyint(1) NOT NULL,
      `CLIENT_ID` bigint(20) unsigned default NULL,
      `LAST_MODIFIED_BY` varchar(45) NOT NULL,
      `LAST_MODIFIED_DATE` datetime NOT NULL,
      PRIMARY KEY  (`PRODUCT_ID`)
      ) ENGINE=InnoDB;
    
    2c. Discard the tablespace, which will delete the newly created .ibd file:
    mysql> ALTER TABLE product DISCARD TABLESPACE;
    
    2d. Copy the pre-existing .ibd file to the datadir/test1 folder
    2e. Import this tablespace:
    mysql> ALTER TABLE product IMPORT TABLESPACE;
    
    This should produce the following error (at least this is most likely). The only way it would not is if MySQL’s current table id matched that of the preexisting ibd table id. In which case, you can now dump your table.
     
    ERROR 1030 (HY000): Got error -1 from storage engine
    
    2f. So, now to check the error log (manually). Look for the following entry:
    081010 11:47:40  InnoDB: Error: tablespace id in file
    '.test1product.ibd' is 1193, but in the InnoDB
    InnoDB: data dictionary it is 1.
    

    So, now we know the internal table id is at 1, and that of the ibd table is 1193.
  3. Clean up working database:
    3a. Manually move the ibd file from the $datadir to a safe location (as you will need this file again).

    3b. Drop this table.

    mysql> DROP TABLE product;
    Note this does not re-set the internal table counter. 
  4. You’ll need to create the number of tables you need to increase the internal table id value.
    In this case, you’d create 1191 test InnoDB tables (already at 1, and need to leave 1 for the actual table, so 1193-2=1191). Run below in a loop.
    for ($1=1; $i<=1191; $1++) {
           CREATE TABLE t# (id int) ENGINE=InnoDB;
    }
    I accomplished this via a simple php script. See the bottom of this page (under "Associated Files") for the exact script. 
  5. After these are created, go ahead and drop this database and all tables (as they are not needed).
    DROP DB test1; 
  6. Now, re-perform steps 2a through 2e.
    mysql> CREATE DATABASE test1;
    mysql> USE test1;
    mysql> CREATE TABLE `product` ( ... ) ENGINE=InnoDB;
    mysql> ALTER TABLE product DISCARD TABLESPACE;
    
    <-- --="" back="" copy="" datadir="" file="" here="" ibd="" is="" original="" test1="" the="" to="" where="" you="">
    
    mysql> ALTER TABLE product IMPORT TABLESPACE;
    
    Success!
    mysql> show tables;
    +-----------------+
    | Tables_in_test1 |
    +-----------------+
    | product         |
    +-----------------+
    1 row in set (0.00 sec)
  7. Now, dump the table using mysqldump, and then you can import this to any MySQL instance. Note, you must dump this and re-import it, or you'll run into problems.

    However, it's possible to encounter crashes and/or reports of corruption in the logs.


    If this happens, try to force innodb recovery (which is most likely), and then dump the table.


    Start by setting innodb_force_recovery=1 (and try 2,3,4,5,6) until the dump works.

    For this example table, I had to set innodb_force_recovery=5 before the dump would succeed.

    The # in the output file name is the value I had innodb_force_recovery set to when trying to perform the dump:
C:Program FilesMySQLmysql-5.0.68bin>
mysqldump -uroot -P3385 test1 product > product_dump1.txt
mysqldump: Couldn't execute 'show table status like 'product'':
Lost connection to MySQL server during query (2013)

C:Program FilesMySQLmysql-5.0.68bin>
mysqldump -uroot -P3385 test1 product > product_dump2.txt
mysqldump: Couldn't execute 'show table status like 'product'':
Lost connection to MySQL server during query (2013)

C:Program FilesMySQLmysql-5.0.68bin>
mysqldump -uroot -P3385 test1 product > product_dump3.txt
mysqldump: Couldn't execute 'show table status like 'product'':
Lost connection to MySQL server during query (2013)

C:Program FilesMySQLmysql-5.0.68bin>
mysqldump -uroot -P3385 test1 product > product_dump4.txt
mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */
* FROM `product`': Lost connection to MySQL server during
query (2013)

C:Program FilesMySQLmysql-5.0.68bin>
mysqldump -uroot -P3385 test1 product > product_dump5.txt

C:Program FilesMySQLmysql-5.0.68bin>
mysqladmin -u root -P 3385 shutdown

C:Program FilesMySQLmysql-5.0.68bin>
mysqldump -uroot -P3385 test1 product > product_dump6.txt

In fact, in this case, I could have simply started with 5.  
This is because the error log stated this:InnoDB: Error: trying to access update undo rec field 19
in index PRIMARY of table test1/product
InnoDB: but index has only 12 fields
So, I knew there was a problem trying to look at the undo logs, and from the manual, a setting of 5 says this:
"Do not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed"
However, it's best to start at 1 and work your way forward so as to prevent as much data loss as possible.
Method #2 - Hex Edit .ibd file
First of all, you'll need to backup everything (ibdata files, ib_logfile(s), data). I'd also perform a mysqldump of everything you currently have, just so you have a mysqldump of it in the event that you need it.
Also, very important, be sure to make a copy of the .ibd file for the specific table in question.
Lastly, get a copy of the CREATE TABLE statement that will recreate this table.
Then, you'll follow the steps #1-5 (but do not perform step #6 yet) outlined on the following page:
http://dev.mysql.com/doc/refman/5.0/en/adding-and-removing.html
Let me post them here for completeness, however:
  1. Use mysqldump to dump all your InnoDB tables.
  2. Stop the server.
  3. Remove all the existing tablespace files, including the ibdata and ib_log files. If you want to keep a backup copy of the information, then copy all the ib* files to another location before the removing the files in your MySQL installation.
  4. Remove any .frm files for InnoDB tables.
  5. Configure a new tablespace.
  6. Restart the server.
  7. Import the dump files.
At this point, MySQL should be running fine with an empty slate (and should have just re-created your new ibdata and log files).
Now, you'll want to recreate the table (just using the CREATE TABLE output from above), and its database to hold it.
Then, you'll basically be following the steps #1-3 outlined on the following page:
http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html
1. Issue this ALTER TABLE statement:
ALTER TABLE tbl_name DISCARD TABLESPACE;
Caution: This statement deletes the current .ibd file.
2. Put the backup .ibd file back in the proper database directory (the one that you copied above).
3. Issue this ALTER TABLE statement:
ALTER TABLE tbl_name IMPORT TABLESPACE;
 
Everything should go smoothly until step #3 (above). More than likely, this will produce an error like the following on your console:
"Got error -1 from storage engine"

Now, if you look in the error log, you'll see something like:
"InnoDB: Error: tablespace id in file '.testt2.ibd' is 2,
but in the InnoDB data dictionary it is 1."

It would not produce the above error and would work fine if the existing table already had a tablespace id of 1. However, this is unlikely.
So, assuming you see the above errors, then you can modify the tablespace id actual ibd file using a hex editor. I would do this on a different copy of the ibd file (other than the original, just in case).

Note that I used "Freeware Hex Editor XVI32" for Windows for this step. Start the program, and then open the .ibd file. You'll see each byte in it's own cell. You can then click on a cell, click edit, and then edit that byte. (http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm)

Now, in this file, there are 2 places where this tablespace id is located.
For me, and I assume it should be the same for you, but just look at the values to be sure, I see the tablespace id values listed at position 37 and 41 (positions 25 and 29 in hex). In the actual hex column, if you're previous tablespace id was 2, then in positions 37 and 41, you'd see 02 and 02.

(Note these positions can change. For instance, I tested on a table with an internal id of 1193. This in hex is 04A9. However, when searching the file, for the first instance of the table id, I found the '04' in position 39 and 'A9' in position 40. Then, for the second instance of the table id, the '04' was at position 43 and the 'A9' was at position 44. So, you'll have to convert the table id to hex, and then search for that value, near the beginning of the file.)

Note that this value (02) may vary depending on what your actual tablespace id is.
Then, simply modify both of those fields to 01, and save the file.
Then, re-do the following 3 steps:
1. ALTER TABLE tbl_name DISCARD TABLESPACE;
2. Put the newly saved .ibd file back in the proper database directory
3. ALTER TABLE tbl_name IMPORT TABLESPACE;

This time, step #3 works fine.
It is at this point you should dump/import the data. At least, get a good mysqldump of this table now. You may find that this causes corruption in InnoDB, and you may need to start MySQL using --force-innodb-recovery.
http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html Forcing InnoDB Recovery
Associated Files :: PHP Scripts
Simple PHP script - Used to create a number of InnoDB tables (to increase internal table id counter):
$dbhost = "localhost:3385";
$dbname = "test1";
$dbuser = "root";
$dbpwd  = "";

mysql_connect($dbhost,$dbuser,$dbpwd) or die(mysql_error());

for ($i = 1033; $i <= 1190; $i++) {
   $dbquery = "CREATE TABLE test1.t" . $i . " (id int) ENGINE=InnoDB";

   echo "" . $dbquery . "";

      $result = mysql_db_query($dbname,$dbquery) or die(mysql_error());

      $j = 0;

      while($row = mysql_fetch_array($result)) {
         $j++;
         echo $row[0];
      }
}

mysql_close();
PHP Internal Table ID Finder - Used to determine the internal Table ID from the binary .ibd file:
/*
Tested with tables from 4.1.23, 5.0.68, 5.1.28, and 6.0.7.
*/

// Set the filename
$filename = "C:\Users\Chris\Desktop\mysql\working\ibds\z1.ibd";

// Read 2 bytes in at a time
$offset = 2;

// Echo filename and path
echo "filename = $filename

";

// Open the filename - need 'rb' for binary file on Windows
$handle = fopen($filename, "rb");

// Define redundant, local variables for possible later functionality and/or checks
$ibd_id_bin = 0;
$ibd_id_hex = 0;
$ibd_id_dec = 0;
$ibd_id_bin2 = 0;
$ibd_id_hex2 = 0;
$ibd_id_dec2 = 0;

// Find the filesize (note: below command messes up script)
//$filesize = filesize($filename));

// Only loop through first 21 bytes - as table is is in $array[18] and $array[20]
for ($z = 0; $z <= 20; $z++) {

 // Set variable $contents equal to 2 ($offset) bytes of binary data
 $contents = fread($handle, $offset);

 // Convert $contents from binary data to hex data
 $contents2 = bin2hex($contents);

 // Convert $contents2 from hex data to decimal data
 $contents3 = hexdec($contents2);

 // Debug Output
 //echo "contents[$z] = " . $contents . "";
 //echo "contents2[$z] = " . $contents2 . "

";
 //echo "contents3[$z] = " . $contents3 . "

";

 // If position 19, array position [18], then store the values
 if ($z == 18) {
  $ibd_id_bin = $contents;
  $ibd_id_hex = $contents2;
  $ibd_id_dec = $contents3;
 }

 // If position 21, array position [20], then store the values
 if ($z == 20) {
  $ibd_id_bin2 = $contents;
  $ibd_id_hex2 = $contents2;
  $ibd_id_dec2 = $contents3;
 }
}
fclose($handle);

// More Debug output
//echo "

The table id is $ibd_id_dec

";
//echo "

The table id is $ibd_id_dec2

";

// Check to see if both values are equal.  If so, then it's
// most certain this is the correct value.
// If not, then there's a chance the positions are off for
// this table (due to versions, etc.).
if ($ibd_id_dec == $ibd_id_dec2) {
 echo "

The table id is $ibd_id_dec

";
} else {
 echo "The values from positions [18] and [20] did not match,";
             echo "so please enable debug output, and check for proper positions.";
}
 
I found this post really helpful. Thank you Chris Calendar.
Original post: http://www.chriscalender.com/tag/innodb-error-tablespace-id-in-file/

Convert Date Time to GMT/UTC

If you want to convert any date time to GMT/UTC for given timezone (observing DST/not).

/**
     * coverts the given date time to GMT/UTC based on timezone provided
     * @param string $date
     * @param string $timezone
     * @return string
     */
    function getGMT($date, $timezone){
        date_default_timezone_set("UTC");
        $daylight_savings_offset_in_seconds = timezone_offset_get( timezone_open( $timezone ), new DateTime() );
        return $new_date = date('Y-m-d H:i:s', strtotime('-'.$daylight_savings_offset_in_seconds.' seconds', strtotime($date)));
    }



$date = "2014-11-30 23:50:00"; //yyyy-mm-dd
//$date = "11/30/2014 23:50:00"; //mm/dd/yyyy
//$date = "30-11-2014 23:50:00"; //dd-mm-yyyy
$timezone = "Asia/Kolkata";
//$timezone = "Australia/Adelaide";
//$timezone = "America/New_York";

echo getGMT($date, $timezone);

Find Random Coordinates in the proximity

If you are asked to find the random coordinates (latitude & longitude) considering that your latitude & longitude as the center and with in the given proximity (radius), then this service will help to get one such coordinate. An example, you are at X location (17.414472, 78.449024) and radius 1 mile.



 /**
     * picks the random latitude & longitude with respect to given within the provided radius
     *
     * @param array $centre    (lat, lng)
     * @param number $radius           
     * @return array:
     */
    function getCoordinates($centre, $radius)
    {
        $radius_earth = 3959; // miles
                             
        // Pick random distance within $distance;
        $distance = lcg_value() * $radius;
       
        // Convert degrees to radians.
        $centre_rads = array_map('deg2rad', $centre);
       
        // First suppose our point is the north pole.
        // Find a random point $distance miles away
        $lat_rads = (pi() / 2) - $distance / $radius_earth;
        $lng_rads = lcg_value() * 2 * pi();
       
        // ($lat_rads,$lng_rads) is a point on the circle which is
        // $distance miles from the north pole. Convert to Cartesian
        $x1 = cos($lat_rads) * sin($lng_rads);
        $y1 = cos($lat_rads) * cos($lng_rads);
        $z1 = sin($lat_rads);
       
        // Rotate that sphere so that the north pole is now at $centre.
       
        // Rotate in x axis by $rot = (pi()/2) - $centre_rads[0];
        $rot = (pi() / 2) - $centre_rads[0];
        $x2 = $x1;
        $y2 = $y1 * cos($rot) + $z1 * sin($rot);
        $z2 = - $y1 * sin($rot) + $z1 * cos($rot);
       
        // Rotate in z axis by $rot = $centre_rads[1]
        $rot = $centre_rads[1];
        $x3 = $x2 * cos($rot) + $y2 * sin($rot);
        $y3 = - $x2 * sin($rot) + $y2 * cos($rot);
        $z3 = $z2;
       
        // Finally convert this point to polar co-ords
        $lng_rads = atan2($x3, $y3);
        $lat_rads = asin($z3);
       
        return array_map('rad2deg', array(
            $lat_rads,
            $lng_rads
        ));
    }


    $my_location = array(17.414472, 78.449024);
    $radius = 1;
    print_r(getCoordinates($my_location, $radius));

Random Numbers or Password or Pin in MySQL

To obtain a random integer R in the range i <= R < j, use the expression FLOOR(i + RAND() * (j – i)). For example, to obtain a random integer in the range the range 7 <= R < 12, you could use the following statement:
SELECT FLOOR(7 + (RAND() * 5));

To generate between 1000 to 9999, i.e., 4 digits then you can do the following using update query
 
 UPDATE users SET password = FLOOR(1000 + RAND() * 8999);

Force HTTPS & WWW using htaccess

RewriteEngine on 

RewriteCond %{HTTPS} off

# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Now, rewrite any request to the wrong domain to use www.

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Get Latitude & Longitude from address

function getLatLong($address){
    $prep_addr = str_replace(' ','+',$address);

    $geocode = file_get_contents('http://maps.google.com/maps/api/geocode/json?address='.$prep_addr.'&sensor=false');

    $output= json_decode($geocode);

    $lat = $output->results[0]->geometry->location->lat;
    $long = $output->results[0]->geometry->location->lng;

    return array("latitude" => $lat, "longitude" => $long);
}

Read .docx file as string

I found it after googling for a day, finally a function that reads the .docx file and return you a string. Hats off to the original author of this function.

function readDocx($file_name){
    $striped_content = '';
    $content = '';
    if(!$file_name || !file_exists($file_name))
        return false;

    $zip = zip_open($file_name);
    if (!$zip || is_numeric($zip))
        return false;

    while ($zip_entry = zip_read($zip)) {
        if (zip_entry_open($zip, $zip_entry) == FALSE)
            continue;
        if (zip_entry_name($zip_entry) != "word/document.xml")
            continue;
        $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
        zip_entry_close($zip_entry);
    }// end while
    zip_close($zip);

    $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
    $content = str_replace('</w:r></w:p>', "\r\n", $content);
    $striped_content = strip_tags($content);
    return $striped_content;
}

Convert object to multi dimensional array

   /**
    *
    * Convert an object to an array
    *
    * @param    object  $object The object to convert
    * @reeturn      array
    *
    */
    
function objectToArray$object )
    {
        if( !
is_object$object ) && !is_array$object ) )
        {
            return 
$object;
        }
        if( 
is_object$object ) )
        {
            
$object get_object_vars$object );
        }
        return 
array_map'objectToArray'$object );
    }

    
/*** convert the array to object ***/
    
$array objectToArray$obj );

    
/*** show the array ***/
    
print_r$array );


 Taken from phpro.org

JSON array of objects

It can be a situation where you got a array of data that should be sent in the JSON format to server via ajax, then you can do the following

<script type="text/javascript" >
groups = ['A', 'B', 'C'];
users  = ['user1', 'user2', 'user3'];

//required format is  [{"group_name" : "A", "leader" : "user1"}, {"group_name" : "B", "leader" : "user2"}, {"group_name" : "C", "leader" : "user3"}]

group_leaders = new Array();

len = groups.length;

for(var i = 0; i < len; i++ ){
    group_leaders.push({"group_name" : groups[i], "leader" : users[i]});
}

alert(JSON.stringify(group_leaders));
</script>

Here you can test here http://jsfiddle.net/sailesh/6wXdY/